給定任乙個各位數字不完全相同的 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~10000,後面將陣列a[4]先賦值為零就可以了。真是要認真讀題,不要想當然呀。不多說了,上**。
#include
#include
#include
#include
#include
using
namespace std;
bool
cmp(
int a,
int b)
intmain()
; cin>>n;
n1=n;
dosort
(a,a+4)
; n1=
0,n2=0;
for(i=
0;i<
4;i++
) n1=n1+
pow(10,
3-i)
*a[i]
;sort
(a,a+
4,cmp)
;for
(i=0
;i<
4;i++
) n2=n2+
pow(10,
3-i)
*a[i]
; n=n2-n1;
printf
("%04d - %04d = %04d\n"
,n2,n1,n)
; i=0;
}while
(n!=
6174
&&n!=0)
;return0;
}
我看了一下其他博主寫的,有乙個呢稱叫柳婼的博主寫的,我覺得很巧妙,**也比較短。
#include
#include
using
namespace std;
bool
cmp(
char a,
char b)
intmain()
while
(s !=
"6174"
&& s !=
"0000");
return0;
}
從**可以看出,這位博主將stl掌握得很好,不說了,學習stl去了。 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 數字黑洞
給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的 6174,這個神奇的數字也叫 kaprekar 常數。例如,我們從6767開始,將得到 7...
PTA 1019 數字黑洞 c語言)
分析 這道題其實並沒有什麼坑點,難度一般。我這裡是寫了兩個函式來分別派出來遞增和遞減。這個題可能唯一需要注意的就是排完序之後可能會出現0位於第一位導致自定義函式返回值就不是四位,後面輸出的時候記得補齊四位就可以 如下 includeint max int n t,s 0,i,j for i 0 i ...