给一串数字,将它的数字升序排列得到一个新数,降序排列得到一个新数,然后用降序的减去升序的得到一个新数。
之后循环这个操作。直到新数在之前已经出现过。
输出这个链的长度和过程。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1000+10;
int sol[MAXN];
char c[12];
bool cmp(char a,char b)
{
return a>b;
}
int up(int a) //将该数字升序排列
{
sprintf(c,"%d",a);
int lc=strlen(c);
sort(c,c+lc);
sscanf(c,"%d",&a);
return a;
}
int down(int a) //将该数字降序排列
{
sprintf(c,"%d",a);
int lc=strlen(c);
sort(c,c+lc,cmp);
sscanf(c,"%d",&a);
return a;
}
int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d",&sol[0])){
int ok=0,i;
if(sol[0]==0) break;
printf("Original number was %d\n",sol[0]);
for(i=1;;i++){
int a=up(sol[i-1]),b=down(sol[i-1]);
sol[i]=b-a;
printf("%d - %d = %d\n",b,a,sol[i]);
for(int j=i-1;j>=0;j--) if(sol[j]==sol[i]) {ok=1;break;} //判断该数字是否在之前已经出现过
if(ok) break;
}
printf("Chain length %d\n\n",i);
}
return 0;
}