[算法]黑洞数

雨燕双飞 提交于 2019-12-04 14:30:04

黑洞数

问题描述

黑洞数又称陷阱数,是类具有奇特转换特性的整数.任何一个数字不全相同的整数,经有限"重排求差"操作,总会得到某一个或者一些数,这些数即为黑洞数."重排求差"操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数.
举个例子,3位数的黑洞数为495.
简易推导过程: 随便找个数,如297,3个位上的数的数从小到大和从大到小各排一次,为972和279,相减,得693.按上面做法再做一次,得到594,再做一次,得到495. 之后反复都是495.
验证4位数的黑洞数6174.

注意:从5位黑洞数开始就是循环节的形式

算法思路

代码示例

# 结束条件: num_max - num_min = 黑洞数
# 循环结构: 求num_max,num_min,作差

def get_max_min(num):
    num_list = []
    while num > 0:
        num_list.append(num % 10)
        num //= 10

    num_list.sort()
    num_min = 0
    for x in num_list:
        num_min = num_min * 10 + x

    num_max = 0
    for x in num_list[::-1]:
        num_max = num_max * 10 + x

    return num_max, num_min


# num: 传入的任意数字
def fn(num):
    print(num)

    # 得到重组后的最大值和最小值
    num_max, num_min = get_max_min(num)
    if num_max - num_min == num:
        return num
    else:
        fn(num_max - num_min)


fn(1234)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!