/*******************************************************************************
题目: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
*******************************************************************************/
#include <stdio.h>
//排序函数,从小到大
void sort(int a[])
{
int i,j,temp;
for(j=1;j<4;j++)
for(i=0;i<4-j;i++)
if(a[i]>a[i+1]){
temp=a[i];a[i]=a[i+1];a[i+1]=temp;
}
}
int main()
{
int nCases,n,max,min,count;
int array[4];
scanf("%d",&nCases);
while(nCases--)
{
count=0; //注意初始化问题,不能写在循环体之外,否则计数累加
scanf("%d",&n);
while(1)
{
count++;
array[0]=n/1000; //取得个十百千位数的数字
array[1]=n%1000/100;
array[2]=n%100/10;
array[3]=n%10;
sort(array); //按从小到大排列
min=array[0]*1000+array[1]*100+array[2]*10+array[3];
max=array[3]*1000+array[2]*100+array[1]*10+array[0];
if(n==max-min) break; //找到6174,退出,否则继续循环
else n=max-min;
}
printf("%d\n",count);
}
return 0;
}
6174问题
最新推荐文章于 2023-06-30 01:30:00 发布