您的位置:首页 > 其它

一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。

2013-08-11 19:05 851 查看
假设你有例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4

其代码如下:

#include<stdio.h>

int turn(int num) //自写的函数

{

int a[10],i,j,temp,num1,num2;

a[0]=num%10;

a[1]=num/10%10;

a[2]=num/100%10;

a[3]=num/1000%10; //将一个4位数的个、十、百、千分离

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;

}

} //利用冒泡排序,从小到大,和从大到小排列

num1=a[3]*1000+a[2]*100+a[1]*10+a[0];

num2=a[0]*1000+a[1]*100+a[2]*10+a[3]; //重新组合成4位数

return num1-num2; //函数值是大数减去小数的差值

}

main()

{

int n,sum=1; //sum的初始化为1

scanf("%d",&n);

while(turn(n)!=n)

{

n=turn(n); //该处几句是最经典,最核心的地方

sum++;

}

printf("%d\n",sum); //输出次数

}

/*while(turn(n)!=n)

{

n=turn(n);

sum++;

}

//该处几句是最经典,最核心的地方*/



=================================================

#include<stdio.h>

int turn(int num)

{

int a[10],i,j,temp,num1,num2;

a[0]=num%10;

a[1]=num/10%10;

a[2]=num/100%10;

a[3]=num/1000%10;

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;

}

}

num1=a[3]*1000+a[2]*100+a[1]*10+a[0];

num2=a[0]*1000+a[1]*100+a[2]*10+a[3];

return num1-num2;

}

main()

{

int n,sum=1,m,k=1;

scanf("%d",&m);

while(m--)

{

scanf("%d",&n);

sum=turn(n);

printf("%d %d\n",sum,k);

k++;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐