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