J

来源:互联网 发布:如何用手机淘宝买东西 编辑:程序博客网 时间:2024/04/27 20:03

Description

任意一个4位自然数N(N不能是4个数字一样,如1111、2222、….9999是不可以的,N也不能是6174),将组成自然数N的4个数字重新排列,形成一个最大数和最小数,最大数和最小数相减,其差是还是自然数,将差的各数字再重新排列,又形成一个最大数和最小数,最大数和最小数相减,其差还是自然数。反复进行,直到差是一个神秘数6174(数学黑洞)结束。

Input

输入数据有多组,每组占一行,每行包含一个4位自然数N。输入文件直到EOF为止!

Output

对每组输入,输出有2行。第一行是所有差,以空格分隔,最后一个数后也有空格;第二行是差的个数。

Sample Input

100015003000

Sample Output

999 8991 8082 8532 617455085 7992 7173 6354 3087 8352 617472997 7173 6354 3087 8352 61746

 

解题思路:

此题为递归题,递归边界为差等于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;} 

 

0 0