NYOJ27 6174问题

6174问题

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到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


补充:有一个神秘的数学黑洞,叫做“6174”。只要你任选4个不完全相同的数字(像1111就不行),让“最大排列”减“最小排列”(例如4321-1234),不断重复这个动作,最后一定会得到相同的结果:6174。
之所以说“6174”是“数学黑洞”,是因为无论你怎么换那4个数字,只要不是完全重复,最后都逃脱不了“6174”的魔掌。而这个“最大减最小”的动作,最多不会超过7次!这又加深了“6174”的神秘性。若以6321为例:
   6321-1236=5085 一次
   8550-0558=7992 二次
   9972-2799=7173 三次
   7731-1377=6354 四次
   6543-3456=3087 五次
   8730-0378=8352 六次
   8532-2358=6174 七次
为什么不继续下去了呢?因为7641-1467又会等于6174,会无限循环(若相减结果低于1000,则千位数补0继续算)。至于为什么会这样?简单的说,由n个数所组成的数字有限,连续做“最大减最小”变换(或称卡普耶卡变换,Kaprekar)最后势必形成回圈。而这个数字“6174”也被称为“卡普耶卡常数”(或翻卡布列克常数)。

AC:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int y,t,w[4],a,b;
cin>>y;
int sum=0;
while(y-6174)
{


w[0]=y/1000;
w[1]=y/100%10;
w[2]=y/10%10;
w[3]=y%10;
sort(w,w+4);
a=w[0]+10*w[1]+100*w[2]+1000*w[3];
b=1000*w[0]+100*w[1]+10*w[2]+w[3];
y=a-b;
sum++;
}
cout<<sum+1<<endl;
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/tingtingyuan/article/details/79955268