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 6174 6
解题思路:
此题为递归题,递归边界为差等于6147,若差不为此值,则对这个差进行递归
细节处理:
此处我用了vector向量将,用于存放当前数值的每位数(其实用个数组应该更简单),对于有些位数不足4位的,要放入0进行填充,最后通过升序排列再累乘,求出当前的差,对于vector向量来说要在每次递归结束后clear,
代码:
#include<iostream> //#include<bits/stdc++.h> #include<vector> #include<algorithm> using namespace std; int sum; void f(int m) { int n=m; sum++; vector<int> a; while(n!=0) { a.push_back(n%10); n=n/10; } if(a.size()==3) a.push_back(0); if(a.size()==2) for(int r=0;r<2;r++) a.push_back(0); if(a.size()==1) for(int r=0;r<3;r++) a.push_back(0); if(a.size()==0) for(int r=0;r<4;r++) a.push_back(0); sort(a.begin(),a.end()); int max,min,cha; max=a[3]*1000+a[2]*100+a[1]*10+a[0]; min=a[0]*1000+a[1]*100+a[2]*10+a[3]; cha=max-min; if(cha==6174) { cout<<cha<<" ";; cout<<endl; cout<<sum<<endl; } else { cout<<cha<<" "; f(cha); } sum=0; a.clear(); } int main() { int n; while(cin>>n) {f(n);} return 0; }