6174问题(二)
描述
假设你有一个各位数字互不相同的M位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个M位数经过多少次这样的操作能出现循环,并且求出操作的次数
比如输入1234 输出1234->3087->8352->6174->6174,一共4次。
输入
第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的M位数
输出
经过多少次上面描述的操作才能出现循环
样例输入
2
1234
23456
样例输出
1234->3087->8352->6174->6174
一共4次
23456->41976->82962->75933->63954->61974->82962
一共6次#include<stdio.h> #include<string.h> int get_next(int x) { char s[10],temp; int n,i,j,a,b; sprintf(s,"%d",x); //转换成字符串 n=strlen(s); for(i=1;i<n;i++) //冒泡排序 for(j=0;j<n-i;j++) if(s[j]>s[j+1]) { temp=s[j]; s[j]=s[j+1]; s[j+1]=temp; } sscanf(s,"%d",&b); //读取字符串中的数据 for(i=0;i<n/2;i++) //字符串反转 { temp=s[i]; s[i]=s[n-1-i]; s[n-1-i]=temp; } sscanf(s,"%d",&a); return a-b; } int main() { int n; scanf("%d",&n); while(n--) { int num[2000],sum,i,flag=0; scanf("%d",&num[0]); printf("%d",num[0]); sum=1; for(;;) { //生成并输出下一个数 num[sum]=get_next(num[sum-1]); printf("->%d",num[sum]); //在数组num中,判断新生成的数 for(i=0;i<sum;i++) if(num[sum]==num[i]) { flag=1; break; } if(flag) break; sum++; } printf("\n一共%d次\n",sum); } return 0; }