給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有「數字黑洞」之稱的 6174,這個神奇的數字也叫 kaprekar 常數。
例如,我們從6767開始,將得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …現給定任意 4 位正整數,請編寫程式演示到達黑洞的過程。
輸入格式:
輸入給出乙個 (0,10^4) 區間內的正整數 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
解題思路:
設n為輸入的整數,設定兩個函式,inttarray()將整數n轉換進入int a[4]中,而arraytint則將排序後的陣列計算成整數。
通過標頭檔案#include內附帶的sort()函式進行陣列排序,格式為sort(a,a+n);預設為公升序排序,若想降序排序,改為sort(a,a+n,cmp); cmp函式寫法如下
bool cmp(int a,int b) // 若感興趣讀者可以去網上進一步了此排序,可應用於結構體排序,字元,字串等各種形式。
注意點:
1.當初試輸入為6174時,也需要進行一次運算;
2.沒經過一輪運算後,都要將陣列a歸為0,否則會影響運算結果:如當輸入為0001時,a[4]=,然後依次降序公升序,最後a[4]=;隨後運算1000-0001=0999;隨後將0999轉換成陣列時a[4]=;運算結果有誤。
#include
#include
#include
using namespace std;
bool cmp1
(int a,
int b)
int a[4]
,i;void
inttarray
(int x)
}int
arraytint()
intmain()
while
(s!=
6174
)system
("pause");
return0;
}
PAT乙級真題 1019 數字黑洞 20分
給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫 kaprekar 常數。例如,我們從6767開始,將得到 77...
PTA 1019 數字黑洞 20 分
include include 直接對string排序 include using namespace std bool cmp char a,int b 降序排列 intmain printf 04d 04d 04d n n,m,n m s to string n m return0 bug在於沒...
PTA 1019 數字黑洞 20分
給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的 6174,這個神奇的數字也叫 kaprekar 常數。例如,我們從6767開始,將得到 7...