Python編程算法【二十八】黑洞數(shù)
【案例內(nèi)容】
黑洞數(shù)又稱陷阱數(shù),是指任何一個(gè)數(shù)字不全相同的三位正整數(shù),在經(jīng)過有限次的“重排求差”操作后,總會(huì)得到495這個(gè)數(shù)。那么495就是黑洞數(shù)。所謂“重排求差”操作,是將組成一個(gè)數(shù)的各位數(shù)字,重新排列后,總會(huì)得到一個(gè)最大數(shù)和最小數(shù),將最大數(shù)減去最小數(shù)。比如,對(duì)三位數(shù)207進(jìn)行“重排求差”操作: 第1次重排求差得:720 - 027 = 693; 第2次重排求差得:963 - 369 = 594; 第3次重排求差得:954 - 459 = 495; 此時(shí),再進(jìn)行“重排求差”,都會(huì)停留在495這一黑洞數(shù)。 請(qǐng)用編程求三位數(shù)的黑洞數(shù)。
【解題思路】
根據(jù)"黑洞數(shù)"的定義,對(duì)于任意一個(gè)數(shù)字不全相同的三位正整數(shù),經(jīng)過多次"重排求差"操作,最后的結(jié)果總會(huì)掉入一個(gè)黑洞數(shù)里,一旦結(jié)果是黑洞數(shù),那么無論再重復(fù)多少次的"重排求差",結(jié)果都是黑洞數(shù),比如三位數(shù)的黑洞數(shù)是495,一旦求得結(jié)果為495,無論再求幾次,結(jié)果依然是495。因?yàn)橛?、9、5三個(gè)數(shù)組成的最大數(shù)和最小數(shù),永遠(yuǎn)都是954和459,它們相減的結(jié)果也永遠(yuǎn)都是495。對(duì)于其他三位正整數(shù)而言,也是同樣的結(jié)果。因此495是三位數(shù)的黑洞數(shù)。
針對(duì)本題,我們可以再次導(dǎo)入itertools包里的permutations文件,利用它可以很方便的獲得任何str型的不同排列情況,拿到所有排列情況后,再將它們重新組合成數(shù)字,并存入列表中,接著通過max()和min()函數(shù)即可得到最大值和最小值,兩者相減就是"重排求差"的結(jié)果,最后循環(huán)比較,如果結(jié)果等于495,即可證明495是三位數(shù)的黑洞數(shù)。
【Python代碼】


本題巧妙借助了itertools包里的permutations文件,可幫助我們快速找出字符數(shù)字的各種排列的情況。只要找到了所有排列情況,后面的重排求差就容易進(jìn)行,只需利用join()函數(shù)、max()函數(shù)及min()函數(shù),就能方便得出最大數(shù)與最小數(shù)的求差結(jié)果,同時(shí)別忘了字符轉(zhuǎn)數(shù)字。