APP下载

数学黑洞“6174”的验证

2022-02-26孙学进王德贵

电脑报 2022年6期
关键词:位数调用排序

孙学进 王德贵

有人问我,天天研究数学问题,数学到底哪里有趣了?数学之美又在哪里?其实,当你研究深入后,会发现数学真的很奇妙!也有很多未解之谜,今天我们来了解一下数学黑洞“6174”。

数学黑洞,就是无论怎样设值,在规定的处理法则下,最终都将得到固定的一個值,再也跳不出去了,就像宇宙中的黑洞可以将任何物质包括光都牢牢吸住,不使它们逃脱一样。

数学黑洞6174,又称卡普雷卡尔(Kaprekar)常数。内容是:

取一个4位数(4个数字全相同的除外),将该数的4个数字重新组合,形成可能的最大数和可能的最小数,再将两者之间的差求出来;对此差值重复同样过程,不足4位在末位补0,最后你总是会得到6174陷入卡普雷卡尔黑洞,而且经过我的验算到达这个黑洞最多需要7个步骤(注:百度百科上说,是14个步骤,存疑)。

今天我们用Python、图形化(SC)和APPInventor来做验证。

有趣的数学问题,加上Python编程,真是绝妙的搭配!近期也一直在和大家分享我的学习过程。在Python等级考试4级学习中,遇到了这个问题,经过一段时间的研究、探讨和分析感到收获颇多,分享给大家,希望能提高你学习Python的兴趣。

这是一个验证的问题,也要解决以下3个问题。

一是输入任意一个4位数(不包含全部相同的数字),验证最后经过运算是不是都得到“6174”;二是在一定范围内,是不是都能得到“6174”;三是得到“6174”最多需要多少个步骤。

首先要将4位数分解开单个数字,存储在新列表中,然后排序列表,输出最大和最小数,做差,然后再存储在新列表中,循环操作,直到得到6174,程序结束。

通过三种编程方法,分别验证,求解。

程序涉及到的是中国电子学会编程等级考试四级内容。

即是输入一个数字不完全相同的4位数,进行验证,看看能不能得到6174,需要几步。

1.递推法

输入一个4位数,但4个数字不能完全相同,将其转换为列表,排序、连接、转换出最大值和最小值,做差,再转换为列表,如果不够4位,则添加“0”,进行下一轮循环,直到得到“6174”,然后输出转换用了多少次(图1)。

下面是验证“1112”的输出结果(图2)。

2.递归法

递归与递推不同之处,是调用了自身,达到循环的目的。过程和方法与递推类似。

不同的是,递推算法中第7行的n=0,去掉了,这是因为如果加上这行,每次调用自身的时候,n都会归0,不能计数,所以必须先设置n=0,然后在自定义函数中用“global n”(图3)。

两种方法验证的结果是完全一样的。

即是验证一定范围内所有数字不完全相同的4位数,看看能不能得到6174,在这个范围内需要最多的步数是多少。

1.递推法

通过递推法验证(图4)。

在1100-1120范围内的验证结果。在“1111”时提示数字完全一样,不能验证(图5)。

在1000-9999范围内的递推法验证,即所有4位数的验证结果。在数字完全一样时,给出提示,从验证结果看,所有不完全相同的4位数,经过运算均可以得到“6174”,运算的最多次数是“7”。

2.递归法

递归法,和递推法一样,也是在验证的基础上,验证一定范围内的所有整数,经过运算是不是都能得到“6174”,并输出最多的运算次数。不同的是递归是通过调用自身,达到循环的目的。

同样,递归法需要将递推算法中的n=0去掉,而在遍历前设置n=0,然后在自定义函数中设置为“global n”。m为最大次数变量(图6)。

在1100-1120范围内的验证结果。在“1111”时提示数字完全一样,不能验证。验证结果和递推算法一样。

在1000-9999范围内的递归法验证,即所有4位数的验证结果。在数字完全一样时,给出提示,从验证结果看,所有不完全相同的4位数,经过运算均可以得到“6174”,运算的最多次数是“7”。我们看到,两种方法的验证结果是完全一样的(图7)。

1.递推法

将前面用递推法的验证和范围的两个程序合并在一起,但要考虑两种方法共同调用了自定义函数,所以需要将部分打印语句保留。

开始是选择“验证”还是“范围”,然后进入循环和调用,输入相关数据,进行运算,如果选择“退出”,则程序结束(图8、图9)。

2.递归法

递归法与递推类似,是将前面用递归法的验证和范围的两个程序合并在一起,同样,开始时还是选择“验证”或是“范围”,然后进入循环和调用,输入相关数据,进行运算,如果选择“退出”,则程序结束(图10、图11)。

在1100-1120范围内的验证结果。在“1111”时提示数字完全一样,不能验证。最后输出运算的最多次数。

验证和范围做在了一起,下面一一讲解。

1.初始化

输入想要验证的4位数,运算次数,都显示在屏幕上, 差值会随着运算改变,直到6174(图12)。

2.输入数据的检验

如果输入的数值不是4位数,则提示输入(图13)。

如果在1000-9999之间则开始运算。

3.验证并显示

先将输入的数值保存在变量“差”中,然后将其每个数字添加到列表“list”中,再调用自定义积木,排序并求最大和最小值(图14)。

如果差為“0”,即是数字相同时,将差设置为“6174”,因为循环的条件是差为“0”。最后提示运算了多少次。

4.自定义积木

自定义积木是为了运算的方便,也是为了程序设计方便。首先检查列表长度,如果小于4则添加“0”补足4位,否则运算会出错。

然后对4个数字进行从大到小排序,最后是输入最大值和最小值,以便计算时调用。同时清空数据列表,将4个变量初始化。

1.初始化

设置需要显示的变量,直观,明了。

输入范围的开始值和结束值。最后显示运算次数中的最大次数值。

2.验证并显示

在范围内依次取值,做验证即可。

循环方法是次开始值增加1,依次验证,当开始值大于结束值时,停止循环。所以循环是包括开始和结束两个值的(图15)。

注意几个问题:

一是数字全部相同的,要停止运算,进入到下一个循环,这里直接设置为6174(验证时停止循环的条件);

二是保存运算次数的最大值,程序运算完,显示出来(图16)。

3.范围和验证合并

首先要将验证和范围都做成自定义积木,然后设计一个选择菜单,是做一个数据验证,还是验证一个范围内的所有数据,通过选择确定,如果输入其他则报错。这和Python程序设计思路是一样的。

1.UI设计

界面如图,无须做过多修饰,组件任意组合,能完成验证就可以(图17)。

2.变量和初始化

设置程序运行需要的变量,将程序初始化(图18)。

3.定义过程:建立数据列表

即可将4位数的4个数字添加到列表中,然后判断是不是数字全部相同,如果全部相同,则做标记(图19)。

4.定义过程:数字排序

将4个数字从大到小排序,然后输出最大值和最小值。

5.提交

判断输入是否为空,是否不是4位数,如果有一项不满足,就会提示输入有误(图20)。

如果输入正确,则判断是不是数字相同,如果数字相同,则提示不能输入相同数字的数(图21)。

如果数字不相同,则进入循环,直到结果为6174。

首先调用数字排序,然后计算差值,将运算次数加1,显示运算过程,同时再次调用建立数据列表,将计算出的差值依次添加到数据列表中,然后进入下一个循环,直到差值为6174(图22)。

完整的程序请在壹零社公众号下载。

测试结果(图23):

1.UI设计

界面设计与验证相似,就是多加了几个组件(图24)。

2.初始化

其實设计时,考虑了两种情况合并的程序(图25)。

3.定义过程

定义过程建立数据列表和数字排序,和验证程序的一样。

4.提交

在一定范围内验证每个4位数是不是经过运算都能得到6174。

所以开始程序还是要检验输入数据的正确性,然后进行循环,从开始值依次加1到结束值,一一验证。最后显示运算的最大次数,与Python和Scratch相同。

验证过程基本和之前的一样。首先显示当前验证的值,然后调用“建立数据列表”,如果数字相同则提示(图26)。

否则就循环执行验证,直到差值为“6174”,同时显示本次运算的次数。如果运算次数大于最大次数,则将最大次数赋值为次数。

完整的程序请在壹零社公众号下载。

测试结果(图27):

1.UI设计

界面设计与“范围”相同,本例在最初设计时,即考虑了合并状态。

2.变量和初始化

这个与验证时一样。

3.定义过程

这个也是一样的,建立数据列表和数字排序两个过程。

4.验证

验证4位数时,点击按钮,即设置初始化值。当前使用的按钮功能,会显示为红色背景(图28)。

5.范围

需要验证一定范围内的所有4位数时,点击按钮,即设置初始化值。当前使用的按钮功能,会显示为红色背景。

6.提交

提交按钮,要先判断是验证状态,还是范围状态,需要判断验证标记。如果验证标记为“真”,则进行验证界面,否则进入范围验证界面,两个程序如前(图29)。

由于前面分别测试过,所以这里不再测试。

三种方法的测试速度都非常快。由于软件的局限,设计思路稍有不同,但均完成了验证任务。

三种程序也可以进行改进,比如,每一步都是自己来完成计算,即输入一个数后,自己取最大和最小值,再做差,依次运算来验证。或是随时查看程序的验证过程。这里给出一个简单的Python程序示例,自定义函数与递推的验证程序一样。运行结果如下(图30)。

如果輸入有误,7次之内没有验证出来,则提示输入有错误,没有完成验证。

本文是我自己的研究过程和心得,有不妥之处,请各位老师和同学斧正!

猜你喜欢

位数调用排序
恐怖排序
暑假训练营·两位数乘两位数和小数的初步认识
《两位数除以一位数笔算除法》教学设计
节日排序
基于Android Broadcast的短信安全监听系统的设计和实现
比大小有窍门
利用RFC技术实现SAP系统接口通信
叶丽娅的年龄
C++语言中函数参数传递方式剖析