任意给一个数字不全相同的n位整数,经过有限次“重排求差”操作(“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数),最终的运算结果总会得到同一个或同一些n位整数,这类整数好像所有n位整数的核心一样,具有很强的磁性,能够吸引其它n位整数,故称这类整数为磁力数。这类整数又好像宇宙中的黑洞或捕捉猎物的陷阱一样,任何n位整数掉进去就出不来了,故又称这类整数为黑洞数、陷阱数。
三位数中的磁力数是495。
四位数中的磁力数是6174。
一般地,当自然数n≥2时,如果从0,1,2,…,9中任取n个不完全相同的数字组成一个n位十进制数k0(首位或前几位的数字可以是0),然后从k0开始不断地做K变换,得出k1,k2,...,那么结果会怎样呢?现在已经知道的是:
n=2,只能形成一个循环:(27,45,09,81,63)。
n=3,只能形成一个循环:(495)。
n=4,只能形成一个循环:(6174)。
n=5,只能形成三个循环:(53955,59994),(61974,82962,75933,63954),(62964,71973,83952,74943)。
n=6,已经发现三个循环:(549945),(631764),(420876,851742,750843,840852,860832,862632,642654)。
n=7,已经发现一个循环:(7509843,9529641,8719722,8649432,7519743,8429652,7619733,8439552)。
n=8,已经发现四个循环:(63317664),(97508421),(64308654,83208762,86526432),(43208766,85317642,75308643,84308652,86308632,86326632,64326654)。
n=9,已经发现三个循环:(554999445),(864197532),(753098643,954197541,883098612,976494321,874197522,865296432,763197633,844296552,762098733,964395531,863098632,965296431,873197622,865395432)。
输入任意位数,生成其对应的磁力数字并输出
from collections import Counter
def split(n): #数字拆分
numlist = []
size = (len(str(n)))
for i in range (size):
if (n / 10) != 0:
(n, mod) = divmod(n , 10)
numlist.append(mod)
return numlist
def joint(numlist): #数组组合成数字
size1 = (len(numlist))
temp0 = 0
for i in range(size1):
temp = numlist[i]*ma.pow(10,(size1-i-1))
temp0 = temp + temp0
return temp0
def diffvalue(n): #做差值
if n< 10:
return (10*n-n)
else:
minl = split(n)
minl.sort()
maxl = minl.copy()
maxl.reverse()
maxn = joint(maxl)
minn = joint(minl)
diff = maxn - minn
return diff
if __name__ == "__main__":
x = input('输入各位数不全相同整数:')
n=eval(x)
minl = []
difflist = []
numdiff = diffvalue(n)
counter = {}
lst = []
while 10 not in counter.values():
if numdiff == 0:
break
else:
difflist.append(numdiff)
numdiff = diffvalue(numdiff)
counter = Counter(difflist)
new_dict = {k:v for k,v in counter.items()}
for key in new_dict:
if new_dict[key] > 8:
lst.append(key)
print("出现的差值及次数集合为:%s"%counter)
print("磁力数为:%s"%lst)