1019 數字黑洞 (20 分)


題目: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];被自己弱到(⊙﹏⊙)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM