题目描述
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数
比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4。
要求编写函数int circle(int num),求数字num按上述规则运算,出现循环数据的操作次数,并返回计算结果。
输入
第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的四位数
输出
经过多少次上面描述的操作才能出现循环
IO模式
本题IO模式为标准输入/输出(Standard IO),你需要从标准输入流中读入数据,并将答案输出至标准输出流中。

代码如下:
#include <stdio.h>
int circle(int num);
int main()
{
int n,x;
scanf("%d",&n);
while(n--)
{
scanf("%d",&x);
printf("%d\n",circle(x));
}
return 0;
}
int circle(int num){
int n1,n2,k,z,sum,t,temp;
int a[4];
t=0;
sum=0;
while(1){
temp=num;
for(int i=3;i>=0;i--)
{
a[i]=temp%10;
temp=temp/10;
}
for(int i=0;i<3;i++)
{
k=i;
for(int j=i+1;j<4; j++)
if (a[j]<a[k])
k=j;
if (i!=k)
{
z=a[i];
a[i]=a[k];
a[k]=z;
}
}
n1=a[3]*1000+a[2]*100+a[1]*10+a[0];
n2=a[0]*1000+a[1]*100+a[2]*10+a[3];
sum=n1-n2;
if(num==sum){
t++;
return t;
}
num=sum;
t++;
}
}
其实原本想用递归的,但是在本地都跑不动,怀疑是时间复杂度太高了,于是用了while(1),计算是否找到它自己,如果是的话return 1退出函数
949

被折叠的 条评论
为什么被折叠?



