J

来源:互联网 发布:淘宝客服转售后话术 编辑:程序博客网 时间:2024/04/27 15:40

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

Hint

 

FAQ | About | Discuss 

题意:

把输入的数各个位上的数重新排列,最大数减最小数到6174结束,输出 所有的差,中间用空格分开,然后输出所有的差的个数

分析:

递归,

代码:

#include<bits/stdc++.h>using namespace std;int a[4],p=0;int comp(int a,int b){return a>b;}int Do(){    int i,s=0;    for(i=0;i<4;i++)        s=a[i]+s*10;    return s;}void Vp(){    int s,f,i;    sort(a,a+4,comp);    s=Do();    sort(a,a+4);    f=Do();    s=s-f;    if(s==6174){        cout<<s<<" ";        p++;        return ;    }    cout<<s<<" ";    p++;    for(i=0;i<4;i++,s/=10)            a[i]=s%10;    Vp();    return ;}int main(){    int n,i;    while(cin>>n)    {        p=0;        for(i=0;i<4;i++,n/=10)            a[i]=n%10;        Vp();        cout<<endl<<p<<endl;    }}
感受:

就是注意空格,最后一个后面也要跟空格。。。容易忘了闭嘴

0 0