給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有「數字黑洞」之稱的 6174,這個神奇的數字也叫 kaprekar 常數。用string儲存數字n,不足4位的話補0:例如,我們從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
while
(s.size()
<4)
對於隨機儲存序列,string可以直接用sort函式排序得到公升序序列:
sort(s.begin(), s.end());
再用reverse函式反轉字串即可得到降序序列:
reverse(s.begin(), s.end());
將兩個string轉換成int型別以便做運算:
a = stoi(s);
再將每步計算結果int轉換成新的string,用到格式轉換:
s = to_string(n)
to_string()需要包含string.h,能用於各類數字–>字串轉換:
string to_string (
int val)
;string to_string (
long val)
;string to_string (
long
long val)
;string to_string (
unsigned val)
;string to_string (
unsigned
long val)
;string to_string (
unsigned
long
long val)
;string to_string (
float val)
;string to_string (
double val)
;string to_string (
long
double val)
;
輸入&輸出的每個數字都得當做4位數,比如輸入1,應該當成0001;第一步運算應輸出:
1000 - 0001 = 0999
輸出格式控制,printf比cout方便的多:
printf("%04d - %04d = %04d\n", sum1, sum2, n);
如果換成cout,需要這樣寫:
cout << setw(4) << setfill('0') << sum1 << " - " << setw(4) << setfill('0') << sum2 << " = " << setw(4) << setfill('0') << n << endl;
(在pat乙級真題 1014 福爾摩斯的約會 c++實現中用到了這種)
#include
#include
#include
using
namespace std;
intmain()
sort
(s.begin()
, s.
end())
; b =
stoi
(s);
reverse
(s.begin()
, s.
end())
; a =
stoi
(s);
c = a - b;
printf
("%04d - %04d = %04d\n"
, a, b, c)
; s =
to_string
(c);
}while
(c!=
0&& c!=
6174);
return0;
}
PAT乙級真題 1019 數字黑洞 20分
給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫 kaprekar 常數。例如,我們從6767開始,將得到 77...
PAT 乙級 1019 數字黑洞
例如,我們從6767開始,將得到 7766 6677 1089 9810 0189 9621 9621 1269 8352 8532 2358 6174 7641 1467 6174 現給定任意4位正整數,請編寫程式演示到達黑洞的過程。輸入格式 輸入給出乙個 0,10000 區間內的正整數n。輸出格...
PAT乙級 1019 數字黑洞
給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫kaprekar常數。例如,我們從6767開始,將得到 7766 6677 10...