黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。或者是冰雹原理中的“1”黑洞数。
随便造一个四位数,如a₁=5463,先把组成部分5463的四个数字由大到小排列得到a2=6543,再把5463的四个数字由小到大排列得a₃=3456,用大的减去小的a₂-a₃=6543-3456=3087,把3087按上面的方法再作一遍,由大到小排列得8730,由小到大排列得0387,相减8730-0387=8352,把8352再重复一遍:8532-2358=6174。如果再往下作,奇迹就出现了!7641-1467=6174,又回到6174。这个6174即为四位数的黑洞数。
代码如下:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @desc: 黑洞数
# 求四位数组合的最大值
def three_max(a, b, c, d): # a、b、c、d分别对应千位、百位、十位、个位
list = [a, b, c, d]
list.sort()
a, b, c, d = list[3], list[2], list[1], list[0]
return a * 1000 + b * 100 + c * 10 + d
# 求四位数组合的最小值
def three_min(a, b, c, d): # a、b、c、d分别对应千位、百位、十位、个位
list = [a, b, c, d]
list.sort()
a, b, c, d = list[0], list[1], list[2], list[3]
return a * 1000 + b * 100 + c * 10 + d
# 求最大最小值
def max_min(j):
tho = j // 1000
hun = j % 1000 // 100 # 百位
ten = j % 100 // 10 # 十位
bit = j % 10 # 个位
max = three_max(tho, hun, ten, bit) # 最大值
min = three_min(tho, hun, ten, bit) # 最小值
return max, min
# 求黑洞数
def black_number(max, min):
j = max - min
k = 0
while k < min: # k控制循环次数
h = j # h记录上一次最大值与最小值的差
max, min = max_min(j)
j = max - min
if j == h: # 最后两次差相等时,差即为所求黑洞数
print("%d " % j)
break # 跳出循环
k += 1
if __name__ == "__main__":
i = int(input("请输入一个四位整数:"))
max, min = max_min(i)
print("max = ", max)
print("min = ", min)
black_number(max, min)
随便输入一个不完全相同的四位数,运行 结果如下: