題目:1019 數字黑洞 (20 分)
給定任一個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然后用第 1 個數字減第 2 個數字,將得到一個新的數字。一直重復這樣做,我們很快會停在有“數字黑洞”之稱的
6174
,這個神奇的數字也叫 Kaprekar 常數。例如,我們從
6767
開始,將得到7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174 7641 - 1467 = 6174 ... ...
現給定任意 4 位正整數,請編寫程序演示到達黑洞的過程。
輸入格式:
輸入給出一個 (0,104) 區間內的正整數 N。
輸出格式:
如果 N 的 4 位數字全相等,則在一行內輸出
N - N = 0000
;否則將計算的每一步在一行內輸出,直到6174
作為差出現,輸出格式見樣例。注意每個數字按4
位數格式輸出。輸入樣例 1:
6767
輸出樣例 1:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174
輸入樣例 2:
2222
輸出樣例 2:
2222 - 2222 = 0000
思路:
- 輸入數字后將四位數分成四個獨立的數后用整型數組依次進行存儲,存儲后將四位數從大到小進行排序,將四位數字相等的情況作為特判。
- 注意一定是四位輸出,不滿足的前面補0。用%04d即可。%04d就是不足4位數前面補0的意思。
代碼:
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <sstream> 5 #include <cmath> 6 #include <algorithm> 7 #include <string> 8 #include <stack> 9 #include <queue> 10 #include <vector> 11 #include <map> 12 using namespace std; 13 14 bool cmp(int a, int b) 15 { 16 return a > b; 17 } 18 19 int main() 20 { 21 int n; 22 int num[4]; 23 scanf("%d", &n); 24 num[0] = n % 10; 25 num[1] = n / 10 % 10; 26 num[2] = n / 100 % 10; 27 num[3] = n / 1000; 28 sort(num, num + 4, cmp); 29 int maxx = num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3]; 30 int minn = num[3] * 1000 + num[2] * 100 + num[1] * 10 + num[0]; 31 if(maxx == minn) 32 { 33 printf("%d - %d = 0000\n", maxx, minn); 34 } 35 else 36 { 37 while(1) 38 { 39 int sub = maxx - minn; 40 printf("%04d - %04d = %04d\n", maxx, minn, sub); 41 if(sub == 6174) 42 break; 43 num[0] = sub % 10; 44 num[1] = sub / 10 % 10; 45 num[2] = sub / 100 % 10; 46 num[3] = sub / 1000; 47 sort(num, num + 4, cmp); 48 maxx = num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3]; 49 minn = num[3] * 1000 + num[2] * 100 + num[1] * 10 + num[0]; 50 } 51 } 52 return 0; 53 }
總結:
剛開始在程序上試跑的時候,居然來了個死循環……一直都沒有減到6174,不科學……一檢查發現,居然把num[3] * 1000 + num[2] * 100 + num[1] * 10 + num[0];寫成了num[3] * 1000 + num[2] * 100 + num[2] * 10 + num[0];被自己弱到(⊙﹏⊙)。