Description
任意一个4位自然数N(N不能是4个数字一样,如1111、2222、….9999是不可以的,N也不能是6174),将组成自然数N的4个数字重新排列,形成一个最大数和最小数,最大数和最小数相减,其差还是自然数,将差的各数字再重新排列,又形成一个最大数和最小数,最大数和最小数相减,其差还是自然数。反复进行,直到差是一个神秘数6174(数学黑洞)结束。
Input
输入数据有多组,每组占一行,每行包含一个4位自然数N。输入文件直到EOF为止!
Output
对每组输入,输出有2行。第一行是所有的差,以空格分隔,最后一个数后也有空格;第二行是差的个数。
Sample Input
1000 1500 3000
Sample Output
999 8991 8082 8532 6174 5 5085 7992 7173 6354 3087 8352 6174 7 2997 7173 6354 3087 8352 61746
题目描述
一个四位数重新排列,最大数减去最小数得到自然数,重复该过程,最后得到6174
解题思路
先将输入的四位数分开,排列出最大和最小值,两个相减,重复这个循环,直到出现6174
源代码
就是数字分解,然后重新组合再相减,过程繁琐一点而已,不过也可以延伸到更高位的数学黑洞#include<bits/stdc++.h> using namespace std; int p(int n); int n; int main() { int n,time; while(cin>>n) { time=0; if(n!=6174) { while(n!=6174) { n=p(n); cout<<n<<" "; time++; } cout<<endl; cout<<time<<endl; } } return 0; } int p(int n) {{ bool flag; int s[4],i,j,t; for(i=0;i<4;i++) { s[i]=n%10; n=n/10; } for(i=0;i<4;i++) { flag=false; for(j=0;j<3-i;j++) { if(s[j]>s[j+1]) { t=s[j]; s[j]=s[j+1]; s[j+1]=t; flag=true; } } if(!flag)break; } int e=(s[3]*1000+s[2]*100+s[1]*10+s[0])-(s[0]*1000+s[1]*100+s[2]*10+s[3]); return e; } }