<pre name="code" class="cpp">/*描述
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到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 fun(int m)
{
int j=0,i,temp;
int a[4];
int x,y;
while(m!=0)
{
a[j]=m%10;
m=m/10;
j++;
}
for(i=0;i<3;i++)
{
for(j=i+1;j<4;j++)
{
if(a[i]<a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
x=1000*a[0]+100*a[1]+10*a[2]+a[3];
y=1000*a[3]+100*a[2]+10*a[1]+a[0];
return x-y;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a[4],sum=1;
int i,j,m,x,y,z;
scanf("%d",&m);
while(m!=6174)
{
m=fun(m);
sum++;
}
printf("%d\n",sum);
}
return 0;
}
/*我们把6174这个四位数各位上的数(6,1,7,4)重新排列后,组成最大的四位数7641和最小的四位数1467,
两者相减,得到7641-1467=6174。
用同样的方法对一个任意选定的各位数不全相同的四位数,例如:4959,计算过程如下:
9954-4599=5355
5553-3555=1998
9981-1899=8532
8532-2358=6174。
我们发现:不论开始是怎样的四位数,只要它的各位数字不全相同,那么上述步骤至多用7次就会得到6174。
(《数学中的智巧》美R.亨斯贝尔格)
这就是“6174”问题:任何不同的四位数,通过从大到小和从小到大的排列,得到差后再重复上述运算,
至多7次,得到的答案都是6174。当然这只是狭义的“6174”,还有三位数、五位数、二进制、八进制等广义的“6174”。
这个问题在被美国麻省理工学院、伯克利大学的学者们提出之后,始终没有得到较好的解决,后来美国数学家马丁将这一
问题发表在《科学的美国人》杂志上,使它成为一个被国际数学界广泛关注的世界难题———“马丁猜想-6174问题”。
我国的梁幼鸣先后撰写了《论泛四位数非同码数集的收敛数》、《关于马丁猜想及其证明》、《关于6174问题的泛序差理论》
等论文,较好地解决“6174”所涉及的主要问题。*/
6174问题
最新推荐文章于 2022-02-22 08:59:28 发布