黑洞数
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。
循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
1 #include<string.h> 2 #include<stdio.h> 3 #include<algorithm> 4 5 using namespace std; 6 7 int a[10]; 8 int b[5]; 9 int c[100000]; 10 int fun(int n) 11 { 12 int p,q; 13 memset(b,0,sizeof(b)); 14 int i=0; 15 p=q=0; 16 while(n) 17 { 18 b[i++]=n%10; 19 n=n/10; 20 } 21 sort(b,b+5); 22 for(i=0;i<5;i++) 23 { 24 p=p*10+b[i]; 25 q=q*10+b[4-i]; 26 } 27 return q-p; 28 } 29 30 31 int main() 32 { 33 int i,j,t,k; 34 memset(c,0,sizeof(c)); 35 for(i=10000;i<99999;i++) 36 { 37 a[j=0]=t=i; 38 while(j<10&&!c[t]) 39 { 40 t=fun(a[j]); 41 if(t==a[0]) 42 { 43 for(k=0;k<j;k++) 44 { 45 printf("%d, ",a[k]); 46 c[a[k]]=1; 47 } 48 printf("%d\n",a[j]); 49 c[a[j]]=1; 50 51 break; 52 } 53 a[++j]=t; 54 } 55 } 56 return 0; 57 }