黑洞数


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

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

循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]

其中数字的先后顺序可以不考虑。

 1 #include<stdio.h>
 2 
 3 //对一个五位数分解,分解成一个一个的 
 4 void fenjie(int *a,int num)
 5 {
 6     for(int i=0;i<5;i++)
 7     {
 8         a[i]=num%10;
 9         num/=10;
10     }
11 }
12 
13 //排序:从大到小 
14 void sort(int *a)
15 {
16     for(int i=0;i<4;i++)
17         for(int j=i;j<5;j++)
18             if(a[i]<a[j])
19             {
20                 int t=a[i];
21                 a[i]=a[j];
22                 a[j]=t;
23             }
24 }
25 
26 //获取最大值 
27 int getMax(int num)
28 {
29     int a[5];
30     fenjie(a,num);
31     sort(a);
32     return a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4];
33 }
34 
35 //获取最小值 
36 int getMin(int num)
37 {
38     int a[5];
39     fenjie(a,num);
40     sort(a);
41     return a[4]*10000+a[3]*1000+a[2]*100+a[1]*10+a[0];
42 }
43 
44 //获取下一个差值 
45 int getNext(int num)
46 {
47     return getMax(num)-getMin(num); 
48 }
49 int a[90000][10]={0},b[90000][10]={0};
50 char c[100000]={0};
51 int main()
52 {
53     int min,max,k=0;
54     for(int i=10000;i<=99999;i++)
55     {
56         //欲形成循环圈 
57         for(int j=0,num=i;j<10;j++)
58             a[i-10000][j]=num=getNext(num);
59         //找出循环圈
60         int j,t;
61         for(j=0,t=1;j<10;j++)
62         {
63             if(a[i-10000][9-j]==b[i-10000][0]) break;
64             b[i-10000][j]=a[i-10000][9-j];
65             if(c[b[i-10000][j]])
66             { 
67                 break;//表示已经输出过 
68             }else{
69                 c[b[i-10000][j]]=1; 
70             }
71             if(t){printf("[");t=0;}
72             printf("%6d",b[i-10000][j]);
73         }
74         if(j>1)
75             printf("]\n");        
76     }
77     getchar();
78     return 0;
79 }

posted @ 2013-05-03 14:58  浪浪辛  阅读(451)  评论(0)    收藏  举报