PTA 中M2018秋C入門和進階練習 7-44 黑洞數 (20 分)
阿新 • • 發佈:2018-12-14
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
#include <stdio.h> int main () { int count=0,max,mini,number; int maximum(int number); int minimum(int number); scanf("%d",&number); while(number!=0){ //三位數的3個數字相同不執行迴圈 count++; max = maximum(number); mini = minimum(number); number = max - mini; printf("%d: %d - %d = %d\n",count,max,mini,number); if (number == 495) break; } return 0; } int maximum(int number){ int a,b,c,t; //取出各位的值分別賦給a,b,c; a = number /100; b = number % 100 / 10; c = number % 10; //按降序把數存入a,b,c; if (b>a) { t = a; a = b; b = t; } if (c>a) { t = a; a = c; c = t; } if (c>b) { t = c ; c = b ; b = t ; } t = a*100 + b*10 + c; return t; } int minimum(int number){ int a,b,c,t; //取出各位的值分別賦給a,b,c; a = number /100; b = number % 100 / 10; c = number % 10; //按降序把數存入a,b,c; if (b>a) { t = a; a = b; b = t; } if (c>a) { t = a; a = c; c = t; } if (c>b) { t = c ; c = b ; b = t ; } t = c*100 + b*10 + a; return t; }