数学实验室系列——物不知数

话说自然数是人们最熟悉不过的数,1、2、3……直至无穷,然而就是这些看似寻常的数字,却蕴藏了许多不寻常的特性。如果把数学家比作厨师,那么这些数字就是食材,它们首先被分类,然后进行加工和处理,最后以某种奇异的形态呈现在我们面前。给数字分类的方式可以说有无穷多种,例如,素数与和数、奇数与偶数、完美数与半完美数,等等。就像一束阳光穿过一个三棱镜,会呈现出美丽的彩虹色,那么按照不同方式分类的数字,也将呈现出令人着迷的结果。

从前的数学家们研究这些数字,他们使用的演算工具是笔和纸,而今天,除了笔和纸,我们还有计算机。计算机最初的用途就是做数学运算,不过要想让计算机为我们服务,我们就必须学会它们的语言,也就是程序语言。如果你学习并使用过某一门程序语言,你会发现这种语言其实远比人类的自然语言来的简单,比学习语言本身更为复杂的是学会思考,用计算机的逻辑进行思考,这也是我们常说的计算思维。

本文尝试用编程的方法来解决一道经典的数学问题——物不知数,这个问题出自《孙子算经》,题目如下:“今有物不知其数,三三数之剩二;五五数之剩三;七七数之剩二。问物几何?”问题说的是:有一个整数,除以三余二,除以五余三,除以七余二,求这个整数。

有一种解决问题的方法叫枚举法,就是对所有可能的结果逐一加以验证,最后排出掉那些错误的结果,从而找到正确的答案。这恰好是计算机最擅长、也是最惯常使用的方法。我们来描述一下解决问题的思路。

我们用N来代表这个答案,假设N在1000以内(你也可以假设N为100或10000),从问题中得知N除7余2,那么N一定大于或等于9,因此我们就从9开始一直到1000,逐个测试其中的每一个自然数,看它是否符合题目的要求,并最终给出答案。

有了上面的思路,我们开始动手做。

本文使用的编程工具是App Inventor,它是一个可视化的编程工具,用于开发安卓系统中的应用,它所使用的编程语言叫做块语言(blockly),是一种积木式语言,不同的语言要素像搭积木一样拼接在一起,避免了文本语言中的拼写错误,非常适合做教学语言。初学者可参考book1.17coding.net上的电子书,并使用ai2.17coding.net开发环境。

在App Inventor中创建一个项目——物不知数,在项目中添加两个标签和一个按钮,如图1所示。

图1 向项目中添加组件:两个标签和一个按钮

将开发工具切换到编程视图,并编写以下代码,如图2所示。

图2 编写求解问题的程序

上面代码中使用循环语句来实现前面提到的枚举法,从9到1000,针对其中的每个数,分别计算这个数除以3、5、7的余数,并判断所得余数是否与题目要求相符,如果相符,则将答案拼成字串,多个答案之间用换行符(\n)分隔,最后,将答案显示在答案标签中。

上述代码中将问题的内容保存在变量中,并在屏幕初始化时让题目内容显示在问题标签中,这样做的目的是为了方便设置题目的显示方式,如果在设计视图中直接将题目内容设置为问题标签的显示文本属性,由于输入框的长度有限,不便于察看和修改问题内容。

对上述程序进行测试。测试需要一部安卓手机,并且事先在手机上安装AI伴侣(一个应用),初学者可以在book1.17coding.net的第一章中找到相关的说明。

测试结果如图3所示。

图3 程序的测试结果

从测试结果得知,这个问题的答案并不唯一,有兴趣的读者不妨选择其中的一个答案进行验算,看结果是否正确。

计算机运行这段程序并给出答案,所需时间不会超过1秒钟,做简单而重复的工作,这是计算机最擅长的。当然,在计算机诞生之前,这个问题就已经有了答案,如果你在搜索引擎中搜“孙子定理”或“物不知数”,你会读到与之相关的知识。

在已经获得答案之后,建议读者再用代数的方法探究一解题方法。对于整数而言,被除数、除数与余数之间存在着某些规律,发现这些规律可以满足我们的好奇心,也能加深我们对数的了解。

——未完待续

注:本文已正式发表于《爱上机器人》杂志创刊号(2018.07)。

(0)

相关推荐