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