查看原题目请点我

解题思路:主要是将数字每位拆分后放在数组上,然后对数组进行升序和降序排列,再将数组中的数字计算出来,最后判断是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;
}