Scratch编程再探数字黑洞之二:Kablek圆舞曲
上一篇我们探讨了魔幻的数字黑洞现象卡布列克常数6174,本文接着探索Kablek现象的五位数的情况,即著名的Kablek圆舞曲。
(一)卡布列克圆舞曲
(1)卡布列克在研究数字时发现:任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个最(较)大的数和一个最(较)小的数,然后用较大数减去较小数,差不够四位数时补零(首位),类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。例如:对输入1369,有
9631-1369=8262
8622-2268=6354
6543-3456=3087
8730-0378=8352
8532-2358=6174
(2)如果用户输入的不是四位数,而是K(k≥5)位数呢?照上面的规则办理,它们的结果将不是变成一个数,而是在几个数字之间形成循环,有一点像角谷猜想的4—2—1循环,这个循环称作卡布列克圆舞曲。例如对于五位数54321:
54321-12345=41976
97641-14679=82962
98622-22689=75933
97533-33579=63954
96543-34569=61974
97641-14679=82962
我们把82962759336395461974称作循环节,即卡布列克圆舞曲。

(二)那我们就接着上一篇,用Scratch编程来模拟另一个有趣的黑洞——卡布列克圆舞曲吧。
(1)根据用户输入的五位数,获得最(较)大数和最(较)小数。那就需要把五位数的各位数字分离出来组成一个列表,进行排序,然后组成两个新的五位数列表。
(2)先用子程序把五位数M的各个位数分离出来,放到一个列表“五位数表”中:

(3)将列表“五位数表”中的元素按降序排列(冒泡排序),生成新的“五位数表”:

(4)根据排序后的“五位数表”,生成大数和小数,存放在变量“大”和“小”里面,由于Scratch可以将数字字符串列表中的数按序组合成数字,因此大数可以直接生成:

(5)有了这些准备以后,我们就可以像生成卡布列克常数那样,用递归迭代的方式生成卡布列克循环数组了,关键是什么时刻停止迭代,前面生成卡布列克常数时,出现6174就结束递归,这里,为了突出“圆舞曲”现象,我们将呈现过程,我们把循环节82962759336395461974中的代表,比如61974出现作为标志,出现一次“循环次数”变量就增加1,当循环次数达到一定次数时就结束递归循环。同样我们把每次的大数减小数的差卡布列克数放入一个列表中:

(6)主程序负责获取用户输入的数据,并调用各个子程序,最终找到数字黑洞循环节:

(7)模拟示例:

(7)试一试:你可以更多位数的情况吗?