解题思路:主要是将数字每位拆分后放在数组上,然后对数组进行升序和降序排列,再将数组中的数字计算出来,最后判断是6174或者0不再循环。还有一些细节方面的问题,如果写代码的时候注意到,就可以直接得满分,而不用纠结某个测试点一直过去,其实有时候就是习惯问题,比如声明变量时顺便赋值为0,还有数组每次计算完后要置0等等。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int arr[8];
bool cmp(int a,int b){
return a>b;
}
void num2arr(int x){
int k=0;
do{
arr[k++]=x%10;
x /= 10;
}while(x!=0);
}
int arr2int(int a[]){
int sum=0;
for(int i=0;i<4;i++){
sum=sum*10+arr[i];
}
return sum;
}
int main(){
int n,first=0,second=0,ans;
scanf("%d",&n);
ans=n;
do{
memset(arr,0,sizeof(arr));
num2arr(ans);
sort(arr,arr+4,cmp);
first=arr2int(arr);
sort(arr,arr+4);
second=arr2int(arr);
ans=first -second;
printf("%04d - %04d = %04d\n",first,second,ans);
}while(ans!=0&&ans!=6174);
return 0;
}
版本2
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int arr[6];
void toarray(int x){
int k=0;
do{
arr[k++] = x%10;
x /= 10;
}while(x!=0);
}
int tonumber(){
int sum = 0;
for(int i=0;i<4;i++){
sum = sum*10 +arr[i];
}
return sum;
}
bool cmp(int a,int b){
return a>b;
}
int main(){
int n,m;
scanf("%d",&n);
while(1){
memset(arr,0,sizeof(arr));
toarray(n);
sort(arr,arr+4,cmp);
n = tonumber();
sort(arr,arr+4);
m = tonumber();
printf("%04d - %04d = %04d\n",n,m,n-m);
n = n - m;
if(n==6174||n==0) break;
}
return 0;
}