就是输入一个数,对这个数的每位排序,分别排成一个最大数和最小数,求其差作为下次操作的数,直到差为0或者6174位置..
这题很阴啊,输入一定为4为,否则就OLE..
注意对操作后不满四位的数的处理
#include <cstdio>
#include <algorithm>
using namespace std;
int cant(int s){
int a=s/1000;
int b=s/100%10;
int c=s/10%10;
int d=s%10;
if(a==b&&b==c&&c==d)return 1;
return 0;
}
int cal(int s){
int bn=s;
int a[4];
a[0]=s/1000;
a[1]=s/100%10;
a[2]=s/10%10;
a[3]=s%10;
int fl=0;
//标志高位有几位为0;
if(a[0]==0){
fl=1;
if(a[1]==1){
fl=2;
if(a[2]=0)fl=3;
}
}
sort(a,a+4);
int bnum,snum;
snum=a[0]*1000+a[1]*100+a[2]*10+a[3];
// 处理高位为0的情况
if(fl==0){
bnum=a[3]*1000+a[2]*100+a[1]*10+a[0];
}else if(fl==1){
bnum=a[3]*100+a[2]*10+a[1];
}else if(fl==2){
bnum=a[3]*10+a[2];
}else{
bnum=a[3];
}
printf("%d-%d=%d\n",bnum,snum,bnum-snum);
return bnum-snum;
}
int main(){
int n;
while(scanf("%d",&n)&&n!=-1){
printf("N=%d:\n",n);
if(n>=9999||n<=1000||cant(n)){//注意,输入一定要是4位数!!否则OLE
printf("No!!\n");
continue;
}
int times=0;
while(n!=0&&n!=6174){
times++;
n=cal(n);
}
printf("Ok!! %d times\n",times);
}
return 0;
}