6174问题
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数
比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4
-
输入
-
第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的四位数
输出
- 经过多少次上面描述的操作才能出现循环 样例输入
-
1 1234
样例输出
-
4
-
第一行输入n,代表有n组测试数据。
#include <stdio.h>
#include <algorithm>
using namespace std;
int chansheng(int a1,int a2,int a3,int a4)//计算出新生成数的差值
{
int da=a4*1000+a3*100+a2*10+a1;
int xiao=a1*1000+a2*100+a3*10+a4;
return (da-xiao);
}
int paixu(int x)//算出各个位数,并将各个数字排序
{
int r=x;
int a[4];
a[0]=r%10;
r=r/10;
a[1]=r%10;
r=r/10;
a[2]=r%10;
r=r/10;
a[3]=r;
sort(a,a+4);
return (chansheng(a[0],a[1],a[2],a[3]));
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a;
scanf("%d",&a);
int r=paixu(a);
int sum=1;//注意这一点,因为在while循环前已经完成了一次变换
while(a!=r)
{
sum++;
a=r;
r=paixu(r);//关键处,自己容易迷糊
}
printf("%d\n",sum);
}
return 0;
}