目录
一、问题的由来
近期由于疫情原因,女儿在家学习,她们教材中涉及一个黑洞的知识点,教学中利用笔算进行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位以上仍以上面的方法进行判断,发现无法实现,会陷入不断的进行中,不能达到停止的条件,经查阅资料后发现,后面的黑洞是一组数而不是一个数,因此上面的解决思路不能解决现在问题,需要新的解决思路。
#五位以上的数字黑洞会陷入到几个数的组