黑洞数

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

 

posted @ 2013-05-19 16:39  萧凡客  阅读(250)  评论(0编辑  收藏  举报