用python实现卡普雷卡尔黑洞(重排求差黑洞)的计算

目录

一、问题的由来

二、卡普雷卡尔黑洞描述

三、问题解决

1、解决思路

2、解决过程

(1)将输入的数字为数字列表

(2)生成最大数和最小数

(3)确定结束时机

(4)主程序部分

(5)逐步改进1(5位数以上的实现过程)

(6)逐步改进2(2位数的处理)

(7)主程序完善

3、完整代码

4、输出结果

(1)两位数

(2)三位数

(3)四位数

(4)五位数

(5)六位数

(6)七位数

(7)八位数

(8)九位数

(9)十位数

心得体会:


一、问题的由来

近期由于疫情原因,女儿在家学习,她们教材中涉及一个黑洞的知识点,教学中利用笔算进行2位数和3位数的计算。基于此,想知道更多位数是否仍存有黑洞问题,就查询了相关问题,并用python解决了这个问题。

二、卡普雷卡尔黑洞描述

拿四位数举例,它的算法如下:

取任意一个4位数(4个数字均为同一个数的,以及三个数字相同,另外一个数与这个数相差1,如1112,,6566等除外),将该数的4个数字重新组合,形成可能的最大数和可能的最小数,再将两者之间的差求出来;对此差值重复同样过程,最后你总是至达卡普雷卡尔黑洞6174,到达这个黑洞最多需要14个步骤。

例如:

大数:取这4个数字能构成的最大数,本例为:4321;

小数:取这4个数字能构成的最小数,本例为:1234;

差:求出大数与小数之差,本例为:4321-1234=3087;

重复:对新数3087按以上算法求得新数为:8730-0378=8352;

重复:对新数8352按以上算法求得新数为:8532-2358=6174;

结论:对任何只要不是4位数字全相同的4位数,按上述算法,不超过9次计算,最终结果都无法逃出6174黑洞;

三、问题解决

1、解决思路

(1)程序接收输入的数字,要求每位都不同

(2)将输入的数字分解为列表

(3)将列表中的数字生成最大数和最小数

(4)再次分解为列表,求出最大最小值,重复操作

(5)直到得到的数不变化或位数变少为止

2、解决过程

(1)将输入的数字为数字列表

#将一个整数拆分为一个列表返回
#方法,先转化为字符串,读出后转变类型并写入列表
def split_number(number):
    list_number = []
    str_number = str(number)
    for item in str_number:
        list_number.append(int(item))
    return list_number

为加强代码的可重复利用,将这部分的功能做成函数,输入是输入的数,返回值是数的列表。

方法是将输入数转化为字符串,通过循环逐个读出,并将其转化为整数存入list_number列表中。

(2)生成最大数和最小数

根据上面产生的列表,得到组成的最大数和最小数。

#根据列表生成整数,并返回最大值最小值
def list_to_number(list_numbers):
    list_numbers.sort()
    max_number_int = 0
    min_number_int = 0
    for index in range(0, len(list_numbers)):  #从循环的时候并不包括len(list_numbers)这个数,这个要注意,即”包头不包尾“
        max_number_int += list_numbers[index]*(10**index)
        min_number_int += list_numbers[index]*(10**(len(list_numbers)-index-1))
    return max_number_int, min_number_int

输入是list_numbers的数字列表,返回max_number_int, min_number_int两个值。

实现方法是将列表进行排序,并根据需要的位数乘以10的相应次方。

(3)确定结束时机

首先以3位和4位数进行编程,判断依据是将生成过程中的最大值保留到变量中,与新的最大值进行比较,如果相等则表示陷入循环,退出

    #方法是最大值与经过变化后最大值一样,陷入循环
        #用于存放最大值,用于比较退出
        use_max_num = 0
        #获取最大值最小值
        maxnum,minnum = list_to_number(list_number01)
        # 循环产生计算过程
        while maxnum != use_max_num:
            #输出计算过程
            print("{0} - {1} = {2}".format(maxnum,minnum,maxnum-minnum))
            use_max_num = maxnum
            list_number = split_number(maxnum - minnum)
            maxnum,minnum = list_to_number(list_number)
        print("{0}位数的数字黑洞为{1}".format(len(list_number01),maxnum-minnum))

过程中注释比较清楚,不过多的做注解。

(4)主程序部分

 #提示按要求输入整数
    print("请输入一个2-10位的整数,要求每一位的数字不同!例如134")
    input_number = input()

    # 分解数据,生成列表
    list_number01 = split_number(input_number)

(5)逐步改进1(5位数以上的实现过程)

5位以上仍以上面的方法进行判断,发现无法实现,会陷入不断的进行中,不能达到停止的条件,经查阅资料后发现,后面的黑洞是一组数而不是一个数,因此上面的解决思路不能解决现在问题,需要新的解决思路。

 #五位以上的数字黑洞会陷入到几个数的组
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值