本篇文章是我们一系列趣味数学的第一篇。我们希望通过这系列通过程序来解决数学问题的文章能给孩子们的编程学习带来更多的乐趣。
什么是黑洞?
“黑洞(Black Hole)”是天文学上的一个概念,是现代广义相对论中,存在于宇宙空间中的一种天体。黑洞的引力极其强大,使得视界内的逃逸速度大于光速。故而,“黑洞是时空曲率大到光都无法从其事件视界逃脱的天体”。因为光都无法从中逃脱,所以它是一个黑色的天体。而且因为光线都被“吸收”了,所以我们也无法直接观测到黑洞。在2019年4月10日,首次发布了黑洞及其附近的第一张影像:使用事件视界望远镜在2017年拍摄到M87星系中心的超大质量黑洞。
什么是数字黑洞
数字黑洞,又称数字陷阱,指的是某种运算,这种运算一般限定从某些整数出发,反复迭代后其结果必然落入一个点或若干点的情况,因为其结局逃无可逃,就跟落入黑洞的物体一样,所以将它称作数字黑洞。
西西弗斯数字黑洞
“西西弗斯数字黑洞”又称为“123数字黑洞”,是因为对于任何正整数通过一定的规则(见下节说明)运算之后,一定会得到123这个黑洞,因此将它称作“123数字黑洞”或者“数学黑洞123”。为什么把它叫西西弗斯数呢?西西弗斯是希腊神话中的人物,与更加悲剧的俄狄浦斯王类似,西西弗斯是科林斯的建立者和国王。他甚至一度绑架了死神,让世间没有了死亡。最后,西西弗斯触犯了众神,诸神为了惩罚西西弗斯,便要求他把一块巨石推上山顶,而由于那巨石太重了,每每未上山顶就又滚下山去,前功尽弃,于是他就不断重复、永无止境地做这件事——诸神认为再也没有比进行这种无效无望的劳动更为严厉的惩罚了。西西弗斯的生命就在这样一件无效又无望的劳作当中慢慢消耗殆尽,永无休止。因此,人们把123黑洞叫做西西弗斯数。
西西弗斯数字黑洞规则
设定一个任意整数数字串,数出这个数中的偶数个数,奇数个数,及这个数中所包含的所有位数的总数,然后将这三个数(偶数个数、奇数个数和所有位数的总数)按照“偶位数-奇位数-总位数”的顺序连接在一起,然后继续对这个新数字计算偶数个数、奇数个数和总位数,再连接得到新的数字…,如此往复,最后一定可以得到数字123。
使用Python实现计算西西弗斯数字黑洞的算法
整个规则相对比较简单,可以快速地写出Python程序如下:
n_str = input("请输入一个自然数:")
n = int(n_str)
odd_num = 0 #奇数个数
even_num = 0 #偶数个数
total_num = 0 #总个数
print(n)
while(n != 123):
odd_num = 0
even_num = 0
total_num = len(n_str)
for i in n_str:
if(int(i) % 2 == 0): #偶数
even_num += 1
else:
odd_num += 1
n_str = str(even_num) + str(odd_num) + str(total_num)
n = int(n_str)
print(n_str)
可以直接点击此链接在少儿编程教学平台上直接观看运行西西弗斯数字黑洞的Python实现。
用Scratch实现的西西弗斯数字黑洞算法
如果用Scratch实现,可以使用以下代码:
Scratch实现可以点击此链接直接在少儿编程教学平台上打开Scratch查看。
C++实现的西西弗斯黑洞数
#include<iostream>
#include<math.h>
using namespace std;
void blackhole(int n){
cout << n << "\n";
if(n == 123){
return;
}
else{
int a = 0,b = 0,c = 0;
while(n > 0){
if(n % 10 % 2 == 0){
a += 1;
}
else{
b += 1;
}
n /= 10;
}
c = a + b;
n = a * 100 + b * 10 + c;
blackhole(n);
}
}
int main(){
int n;
cin >> n;
blackhole(n);
return 0;
}
读者可以对比这3种编程语言的实现方式,也可以根据其规则写出自己的程序。
(题图照片来自Unsplash),正文插图来自Wikipedia。西西弗斯油画作者为缇香。