循环圈

来源:互联网 发布:海岛奇兵升多管数据 编辑:程序博客网 时间:2024/05/16 01:16

任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。

比如,刚才的数字会落入:[82962,75933, 63954, 61974] 这个循环圈。

 

请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。

 

循环圈的输出格式仿照:

[82962, 75933, 63954, 61974]

#include <iostream>#include<cstring>#include<algorithm>using namespace std;int a[100];int count1=0;int bj;int off(int n,int t)//t==0求最小值t==1求最大值{    int num[5];    memset(num,0,sizeof(num));    int k=0;    while(n)    {        num[k]=n%10;        n=n/10;        k++;    }    sort(num,num+5);    int max=0,min=0;    if(t==0)//返回最小值    {        min=num[4]+num[3]*10+num[2]*100+num[1]*1000+num[0]*10000;        return min;    }    else//返回最大值    {        max=num[0]+num[1]*10+num[2]*100+num[3]*1000+num[4]*10000;        return max;    }}bool check(int ch)//检查{    for(int i=0; i<count1; i++)    {        if(a[i]==ch)        {            bj=i;            return true;        }    }    return false;}void f(int n)//计算{    int max=off(n,1);    int min=off(n,0);    int ch=max-min;    if(check(ch))        return;    else    {        a[count1]=ch;        count1++;        f(ch);    }}int main(){    int n;    cin>>n;    memset(a,0,sizeof(0));    f(n);    //输出    cout<<"[";    for(int i=bj; i<count1; i++)    {        cout<<a[i];        if(i!=count1-1)            cout<<",";    }    cout<<"]";    cout<<endl;    return 0;}

0 0
原创粉丝点击