黑洞數也稱為陷阱數,又稱“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 }