目录
前面对卡普雷卡尔黑洞(重排求差黑洞)进行分析计算,有兴趣的可以点击下面的链接研究一下!
下面我会利用python来实现西绪福斯黑洞(即123数字黑洞)的计算与演示。
一、123数字黑洞描述
数学中的
123
就跟英语中的ABC一样平凡和简单。然而,按以下
运算顺序
,就可以观察到这个最简单的数字。
黑洞的值:
设定一个任意数字串,数出这个数中的
偶数
个数,
奇数
个数,及这个数中所包含的所有位数的总数,
例如:1234567890,
1.偶:数出该数数字中的偶数个数,在本例中为2,4,6,8,0,总共有 5 个。
2.奇:数出该数数字中的奇数个数,在本例中为1,3,5,7,9,总共有 5 个。
3.总:数出该数数字的总个数,本例中为 10 个。
4.新数:将答案按 “偶-奇-总” 的位序,排出得到新数为:5510。
5.重复:将新数5510按以上算法重复运算,可得到新数:134。
6.重复:将新数134按以上算法重复运算,可得到新数:123。
结论:对数1234567890,按上述算法,最后必得出123的结果,我们可以用计算机写出程序,测试出对任意一个数经有限次重复后都会是123。换言之,任何数的最终结果都无法逃逸123黑洞……
二、问题解决
1、内容描述
(1)设定任意数字字符串,数出这个数的偶数个数,奇数个数和数中包含的所有位数,并按”偶-奇-总“位序组合生成新数。
(2)然后重复上述过程,最后得到123。
2、实现思路
(1)程序接收输入一个数字字符串
(2)将输入的数字分解为数字列表
(3)计算出偶数、奇数,将偶数、奇数和总数组合成一个新数
(4)将得出的数进行重复操作,直到得到的数不再变化或位数变少为止
(5)依次输出每次的数据方便验算
3、代码功能实现
(1)分解输入的数字字符串,生成数字列表
#分解输入的数字字符串
def split_number(number):
list_number = []
str_number = str(number)
for item in str_number:
list_number.append(int(item))
return list_number
功能的实现基本上与上一个黑洞的一样,这里不再详述。
(2)由数字列表生成新的数字字符串
输入为上面程序产生的数字列表,输出新的数字字符
#由数字列表生成新的数字字符串
def list_to_newstring(list_number):
#依次取出数据进行偶数、奇数的计数
count_even = 0 #存放偶数个数数值
count_odd = 0 #存放奇数个数数值
for item in list_number:
if item % 2 == 0:
count_even += 1
else:
count_odd += 1
newstring =str(count_even) +str(count_odd) +str(count_even+count_odd)
return newstring
依次取出数字列表中的数,进行奇偶性的判断,累计得到奇偶个数,从而生成新的字符串
(3)主程序实现输入和输出
print("请输入由数字组成的字符串,位数及重复均无要求")
input_string = input()
# 分解数据,生成列表
list_number01 = split_number(input_string)
result_list = [] # 写入结果值
hole_list = [] # 写入循环的结果,即为黑洞值
result_list.append(input_string)
while True:
#根据列表生成新数
new_string = list_to_newstring(list_number01)
if new_string not in result_list:
result_list.append(new_string)
#新数产生新列表
list_number01 = split_number(new_string)
else:
break
#输出结果列表
print("输出结果为:")
for item in result_list:
print(item)
发现重复数据,立即停止循环,结果保存到result_list列表中,最后用于输出。
三、完整代码
"""程序用于演示西绪福斯黑洞(即123数字黑洞)
内容描述:
设定任意数字字符串,数出这个数的偶数个数,奇数个数和数中包含的所有位数,并按”偶-奇-总“位序组合生成新数,
然后重复上述过程,最后得到123。
方法:
程序输入一个数字字符串,程序会按照下面进行演算:
将输入的数字分解为数字列表,计算出偶数、奇数,将偶数、奇数和总数组合成一个新数,
将得出的数进行重复操作,直到得到的数不再变化或位数变少为止
依次输出每次的数据方便验算
"""
#分解输入的数字字符串
def split_number(number):
list_number = []
str_number = str(number)
for item in str_number:
list_number.append(int(item))
return list_number
#由数字列表生成新的数字字符串
def list_to_newstring(list_number):
#依次取出数据进行偶数、奇数的计数
count_even = 0 #存放偶数个数数值
count_odd = 0 #存放奇数个数数值
for item in list_number:
if item % 2 == 0:
count_even += 1
else:
count_odd += 1
newstring =str(count_even) +str(count_odd) +str(count_even+count_odd)
return newstring
def main(): # 提示按要求输入整数
print("请输入由数字组成的字符串,位数及重复均无要求")
input_string = input()
# 分解数据,生成列表
list_number01 = split_number(input_string)
result_list = [] # 写入结果值
hole_list = [] # 写入循环的结果,即为黑洞值
result_list.append(input_string)
while True:
#根据列表生成新数
new_string = list_to_newstring(list_number01)
if new_string not in result_list:
result_list.append(new_string)
#新数产生新列表
list_number01 = split_number(new_string)
else:
break
#输出结果列表
print("输出结果为:")
for item in result_list:
print(item)
main()
四、结果输出
1、验证前文的数据
对前面提到的数据进行验证,运算结果如下:
请输入由数字组成的字符串,位数及重复均无要求
1234567890
输出结果为:
1234567890
5510
134
123
2、随机数字字符串
请输入由数字组成的字符串,位数及重复均无要求
1111111111111111111111111111111111111111111
输出结果为:
1111111111111111111111111111111111111111111
04343
325
123
数据分析:
第一次:43个1,偶数为0,奇数为43,总数为43,因此新数为04343
第二次:3个偶数,2个奇数,总数为5,因此新数为325
第三次:1个偶数,2个奇数,总数为3,因此新数为123
第四次:1个偶数,2个奇数,总数为3,因此新数为123,重复退出,得到结果
黑洞数字为123,结果正确