黑洞數:黑洞數又稱陷阱數,是類具有奇特轉換特性的整數。任何一個數字不全相同整數,經有限“重排求差”操作,總會得某一個或一些數,這些數即為黑洞數。“重排求差”操作即把組成該數的數字重排后得到的最大數減去重排后得到的最小數。或者是冰雹原理中的“1”黑洞數
EG:
- 舉個例子,三位數的黑洞數為495
- 簡易推導過程:隨便找個數,如297,三個位上的數從小到大和從大到小各排一次,為972和279,相減,得693
- 按上面做法再做一次,得到594,再做一次,得到495
- 之后反復都得到495
- 再如,四位數的黑洞數有6174
1 def fun(n): 2 k = n 3 a = [] 4 while k > 0: 5 a.append(k % 10) 6 k //= 10 #這里要使用地板除 7 8 a.sort() 9 10 s1 = 0 11 for i in a: 12 s1 = s1*10 + i 13 14 s2 = 0 15 for i in a[::-1]: 16 s2 = s2*10 + i 17 18 if (s2 - s1) == n: 19 return n 20 else: 21 return fun(s2 - s1)
傳進去一個整數,然后返回一個黑洞數,但是這個里面可以改進,將一個整數拆分成一個列表,可以其使用字符串的思想,獲得排列后最大的數和最小的數,可以使用一個reduce內置函數和lambda表達式
1 from functools import reduce 2 def fun(n): 3 k = n 4 a = [int(i) for i in str(n)] #一行代碼搞定 5 6 a.sort() 7 8 s1 = reduce(lambda x, y: x * 10 + y, a) #一行代碼搞定 9 s2 = reduce(lambda x,y:x * 10 +y,a[::-1]) 10 11 12 s2 = 0 13 for i in a[::-1]: 14 s2 = s2*10 + i 15 16 if (s2 - s1) == n: 17 return n 18 else: 19 return fun(s2 - s1)