PTA 真題 1019 數字黑洞 20分

2021-10-05 04:29:17 字數 1633 閱讀 3397

給定任乙個各位數字不完全相同的 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...