6174问题
描述
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到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
==============================================================================================================
解析:
原本这是一道水题,结果被我想多了,开始以为直接用数字会比较耗时,一直在解决 atoi 、 itoa 函数不能使用的问题,将数字与字符串不停地转化,结果...超时了(╯﹏╰),浪费了很多时间,最后改用在数字上的操作,就ok了。
==============================================================================================================
代码如下:
#include
int tran(int m)//计算排序后的数字
{
int a[4], i, j, t;
a[0] = m%10;
a[1] = m/10%10;
a[2] = m/100%10;
a[3] = m/1000;
//排序
for(i = 0; i < 4; i++)
for(j = i+1; j < 4; j++)
if(a[i] < a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
i = a[3]*1000 + a[2]*100 + a[1]*10 + a[0];//小
j = a[0]*1000 + a[1]*100 + a[2]*10 + a[3];//大
return (j-i);
}
int main (void)
{
int n, x, count;
scanf("%d", &n);
while(n--)
{
scanf("%d", &x);
count = 1;
while(x != 6174)//计算得到6174的所需次数
{
x = tran(x);
count++;
}
printf("%d\n", count);
}
return 0;
}