7-44 黑洞数(20 分)
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。
任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)
例如,对三位数207:
- 第1次重排求差得:720 - 27 = 693;
- 第2次重排求差得:963 - 369 = 594;
- 第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。
任意输入一个三位数,编程给出重排求差的过程。
输入格式:
输入在一行中给出一个三位数。
输出格式:
按照以下格式输出重排求差的过程:
序号: 数字重排后的最大数 - 重排后的最小数 = 差值
序号从1开始,直到495出现在等号右边为止。
输入样例:
123
输出样例:
1: 321 - 123 = 198 2: 981 - 189 = 792 3: 972 - 279 = 693 4: 963 - 369 = 594 5: 954 - 459 = 495
1 #include <stdio.h> 2 3 int number(int a[], int len, int flag); 4 int max(int a[], int len); 5 void dd(int a[], int n); 6 7 int main(int argc, char const *argv[]) 8 { 9 int n; 10 int a[3]; 11 12 scanf("%d", &n); 13 14 int len = sizeof(a)/sizeof(a[0]); 15 16 // 输入的数是495也要输出一次 17 for ( int i = 1; n != 495 || i == 1; i++ ) { 18 dd(a,n); 19 // 选择排序 20 for ( int i = len-1; i > 0; i-- ) { 21 int maxid = max(a,i+1); 22 // swap a[maxid], a[len-1] 23 int t = a[maxid]; 24 a[maxid] = a[i]; 25 a[i] = t; 26 } 27 // 1-->mim 0-->max 28 int min = number(a,sizeof(a)/sizeof(a[0]),1); 29 int max = number(a,sizeof(a)/sizeof(a[0]),0); 30 if ( min == max ) { // 三位数的3个数是否相同 31 printf("%d: %d - %d = %d\n", i, max, min, max-min); 32 break; 33 } else { 34 printf("%d: %d - %d = %d\n", i, max, min, max-min); 35 } 36 n = max - min; 37 } 38 39 return 0; 40 } 41 42 int number(int a[], int len, int flag) 43 { 44 int num = 0; 45 if ( flag ) { 46 for ( int i = 0; i < len; i++ ) { 47 num = num * 10 + a[i]; 48 } 49 } else { 50 for ( int i = len-1; i >= 0; i-- ) { 51 num = num * 10 + a[i]; 52 } 53 } 54 return num; 55 } 56 57 int max(int a[], int len) 58 { 59 int maxid = 0; 60 int i; 61 for ( i = 1; i < len; i++ ) { 62 if ( a[i] > a[maxid] ) { 63 maxid = i; 64 } 65 } 66 return maxid; 67 } 68 69 void dd(int a[], int n) 70 { 71 a[0] = n / 100; 72 a[1] = n / 10 % 10; 73 a[2] = n % 10; 74 }