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