PAT 乙級 1019 數字黑洞 20 分

2021-09-25 08:49:57 字數 1682 閱讀 9545

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

解題思路:輸入是字元,然後按位進行排序,非公升序排序得到最大值,非降序得到最小值,兩個相減,等到下乙個數,一直迴圈,知道數等於0或者等於黑洞6174。

注意:輸入的數字是0-104之間的乙個數,當數小於1000時,需要補零。

#include #include #include using namespace std;

bool cmp(int a,int b)

int main()

if(strlen(s1)==2)

if(strlen(s1)==3)

while(1)

cout << " " << "-" << " ";

max=(s1[0]-'0')*1000+(s1[1]-'0')*100+(s1[2]-'0')*10+(s1[3]-『0』);

sort(s1,s1+4);//非降序排列

for(int i=0;i<4;i++)

min=(s1[0]-'0')*1000+(s1[1]-'0')*100+(s1[2]-'0')*10+(s1[3]-'0');

next =max-min;

s1[0] = next/1000%10+'0' ;

s1[1] = next/100%10+'0' ;

s1[2] = next/10%10+'0';

s1[3] = next/1%10+'0';

cout << " = " << s1[0] << s1[1] << s1[2] << s1[3]<< "\n";

if(next==0 ||next==6174)break;

} return 0;

}

結果:

PAT乙級 1019 數字黑洞 20

給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫kaprekar常數。例如,我們從6767開始,將得到 7766 6677 10...

PAT 乙級 1019 數字黑洞 20

時間限制 100 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停...

PAT乙級1019 數字黑洞 20

題目 給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫kaprekar常數。例如,我們從6767開始,將得到 7766 6677...