描述
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到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>
int main()
{
int N,i,n,m,k,t,j,max,min;
int a[4]; //定义数组,是想可以直接利用for循环来进行大小交换,如果用四个变量的话需要用函数来实现
scanf("%d",&N);
while(N--)
{
scanf("%d",&n);
for(k=1;k<100;k++)
{m=n; //n的值最后会发生改变,用来存储最大值与最小值的差,成为新的n,所以用m来存储原来n的值
a[3]=n%10; //将每个位置的数存到数组里
a[2]=n/10%10;
a[1]=n/100%10;
a[0]=n/1000;
for(i=0;i<3;i++) //进行从小到大排序
for(j=i+1;j<4;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
max=a[3]*1000+a[2]*100+a[1]*10+a[0]; //设置最大值和最小值
min=a[0]*1000+a[1]*100+a[2]*10+a[3];
n=max-min;
if(n==m) //进行关键比较
break;
else
continue;
}
printf("%d\n",k);
}
return 0;
}
思路大概都是这样,如果有疑问和更好的可以评论留言,感谢你的访问。