給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有「數字黑洞」之稱的6174,這個神奇的數字也叫kaprekar常數。
例如,我們從6767開始,將得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …現給定任意4位正整數,請編寫程式演示到達黑洞的過程。
輸入給出乙個(0, 10000)區間內的正整數n。
如果n的4位數字全相等,則在一行內輸出「n - n = 0000」;否則將計算的每一步在一行內輸出,直到6174作為差出現,輸出格式見樣例,每行中間沒有空行。注意每個數字按4位數格式輸出。
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
需要注意幾個地方:
c++版本:
#include
#include
#include
#include
using
namespace std;
//數字降序排序
intgetmax
(int num)
sort
(v.begin()
,v.end()
);while
(v.size()
<4)
return v[0]
+10*v[1]+
100*v[2]
+1000
*v[3];
}//數字公升序排序
intgetmin
(int num)
sort
(v.begin()
,v.end()
);while
(v.size()
<4)
return v[3]
+10*v[2]+
100*v[1]
+1000
*v[0];
}//列印輸出數字,不足四位數則補齊
void
print
(int num)
else
if(num<
100)
else
if(num<
1000
) cout<}int
main()
print
(max)
; cout<<
" - "
;print
(min)
; cout<<
" = "
;print
(max-min)
; cout
if(num==
6174
)break;}
}
在討論區看到乙個python版本**,深感簡潔度上的差距。一併貼在這裡,作為啟發。
num =
input()
defcalc
(num):if
len(
set(num))==
1:print
(num +
" - "
+ num +
" = 0000"
)return
"6174"
else
: num1 =
"".join(
sorted
(num, reverse=
true))
num2 =
"".join(
sorted
(num)
) result =
str(
int(num1)
-int
(num2)
)print
(num1 +
" - "
+ num2 +
" = "
+ result)
return result
num=calc(num.ljust(4,
"0")
)while num !=
"6174"
: num = calc(num.ljust(4,
"0")
)
PAT 乙級真題 1009 1019 數字黑洞
題目描述 給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到 乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫kaprekar常數。例如,我們從6767開始,將得到 7766 6...
PAT乙級真題 1019 數字黑洞 C 實現
給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的 6174,這個神奇的數字也叫 kaprekar 常數。例如,我們從6767開始,將得到 7...
PAT乙級真題 1019 數字黑洞 20分
給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫 kaprekar 常數。例如,我們從6767開始,將得到 77...