循环圈

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xllfy123/article/details/58592261

任意一个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;
}

猜你喜欢

转载自blog.csdn.net/xllfy123/article/details/58592261
今日推荐