您的位置:首页 > 其它

递推递归-J - 数学黑洞

2017-04-09 19:05 218 查看
题目:

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


解题思路:

先把四位数的每一位都求出来,然后进行排序,然后求出最大数和最小数,相减判断是否符合终止条件,不符合就输出差值以后继续调用。

代码:

#include <bits/stdc++.h>

using namespace std;

int k=0,b[20];

void F(int a)

{   int j,maxx=0,minn=0;

     b[0]=a/1000;b[1]=a%1000/100;

     b[2]=a%1000%100/10;b[3]=a%10;

     sort(b,b+4);

    minn=b[0]*1000+b[1]*100+b[2]*10+b[3];

    maxx=b[3]*1000+b[2]*100+b[1]*10+b[0];

    j=maxx-minn;

    cout<<j<<" ";

    k++;

   if(j!=6174)

    {

      return F(j);

    }

}

int main()

{    int a;

      while(cin>>a)

       {F(a);

       cout<<endl;

       cout<<k<<endl;

       k=0;}

    return 0;

}

回顾:

这道题我第一次写的时侯想写一个可以适用于所有数的代码所以不是按照数字只有四位数来做的,做出来计算结果也对但是就是WR,不知道哪里错了,无奈之下只好按照四位数来做,但是感觉这样写就真的是就题论题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: