《递归递推练习》J

来源:互联网 发布:阿里云免费镜像 编辑:程序博客网 时间:2024/05/17 00:03
  • 原题

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

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

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

  • 思路
    把整数拆开放到数组中,对数组排序,即得到由各位数字排列得的最大值和最小值。最大值减最小值得到下一个数,进入循环。直到得到6174,退出循环。

  • AC代码

#include<bits/stdc++.h>using namespace std;int main(){    int a[4]={0};    int i,max=0,min=0,j=1,n;    while(scanf("%d",&n)!=EOF)    {        while(1)        {            for(i=0;i<4;i++)            {                a[i]=n%10;                n=n/10;            }            sort(a,a+4);            max=0;min=0;            for(i=0;i<4;i++)            {                min=min*10+a[i];            }            for(i=3;i>=0;i--)            {                max=max*10+a[i];            }            n=max-min;            if(n==6174)            {                cout<<n<<" "<<endl;                cout<<j<<endl;                j=1;                break;            }            else            {                cout<<n<<" ";                j++;            }        }    }}
0 0