递归之数字黑洞

数学黑洞

Time Limit: 1500 ms Memory Limit: 65536 KiB

Submit Statistic Discuss

Problem 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

Hint

Source

#include
#include
#include
int min[4]= {0};
int max[4]= {0};
int num[4]= {0};
int main()
{
    int n,i,j,t,f,k,s;
    while(~scanf("%d",&n))
    {s=0;
        while(n!=6174)
        {
            num[0]=n%10;
            num[1]=n/10%10;
            num[2]=n/100%10;
            num[3]=n/1000;
            for(i=0; i<3; i++)
            {
                f=i;
                for(j=i+1; j<=3; j++)
                {
                    if(num[j]<=num[f])
                    {
                        f=j;
                    }
                }
                t=num[i];
                num[i]=num[f];
                num[f]=t;
            }
            for(i=0,k=0; i<=3; i++)
            {
                min[k++]=num[i];
            }
            for(i=3,k=0; i>=0; i--)
            {
                max[k++]=num[i];
            }
            n=(max[0]*1000+max[1]*100+max[2]*10+max[3])-(min[0]*1000+min[1]*100+min[2]*10+min[3]);
            printf("%d ",n);
            s++;
        }
        printf("\n");
        printf("%d\n",s);
    }
    return 0;
}

Think:
首先开3个数组,一个存分解的N的各个部分,然后把这些部分排好序,然后一个数组存放从大到小的数,另一个存放从小到大的数,在条件N!=6174的前提加减即可

你可能感兴趣的:(递归之数字黑洞)