趣味数学编程题解之车牌号码之迷
IT商界
阿亮是我的好朋友,学校里举行了一个有意思的趣味数学大赛,阿亮拿了头名。可他并不是很高兴,因为他的分数非常低。当笔者看到这些有趣的题目后,手有点发痒了。能不能用计算机来解决呢?这个问题一直萦绕在自己的心头。
对于有些数学题目,有时用计算机来解更加有意思和有效,怎样解呢?自然是编程。编程有时却成了编程初学者的“最难”。其实并不难,和干任何事情是一个道理,在你知道“程序=算法+数据结构”并有了一些编程的经验后,编程的方法和工具便成为关键。我们只要掌握了分析问题的方法,再有一种好的辅助工具,学会应该不难。
解决方法后面我们将慢慢探讨,先看一下工具。俗语说得好,磨刀不误砍柴工。N-S图就是一种很好的分析问题工具。下面我们将是对车牌号码趣味数学问题的分析过程,从这简单有趣的事例中学习N-S图。如果不用电脑,考虑出他们的结果,可真要动一番脑筋。不信,你就先试试看;用电脑,当然也需要下一番功夫。
题目:车牌号码之谜
警察局的老K警员遇到了下面的一个难题,一辆卡车违反了交通规则,撞死了行人,司机畏罪驾车逃跑了。当时有3个人目击了这一车祸的发生,但都没有看清卡车的牌照号码,只注意到牌照号码的某些特征。
甲:记得牌照前两个数字是相同的;
乙:记得牌照号码的后两个数字是相同的;
丙是一位数学家,他说:“牌照号码肯定是四位数,并且这个四位数恰好是一个整数的平方。”
根据这些线索,你能判断出正确的牌照号码吗?
你可以开动自己的脑筋来帮助老K,在21世界这个信息化的时代里,还有另外一种有意思的解决问题的方法:
编程,让电脑帮你找出答案来。
OK,下面我们也来当一回警察。当警察可不能赤手空拳,我们的工具就是N-S图。
要想用N-S图来分析,我们首先要知晓什么是N-S图。
什么是N-S图
N-S图是我们编程过程中常用的一种分析工具,是由两个美国人I.Nassi和B.Schneiderman发明的,他们提出了最初分析问题方法。N-S图非常地简洁,只有三种语句:顺序语句、分支语句和循环语句。
(1)顺序语句
如图1所示,所要执行的工作只有时间的先后没有其他区别时用顺序语句,图中语句1、语句2和语句3的地位是平等的,只有执行上的先后关系,程序运行一次,每条语句都执行一次。
(2)分支语句
至少有两种方案可供选择,但每次只能根据条件选择一种。也就是说图2中的语句1和2的地位是不一样的,程序执行一次,只能根据“条件”选择两者中的一个,另一个则不参与本次的执行。
(3)循环语句
如图3示,根据循环的条件,决定"循环体"执行多少次。循环其本质上是多个顺序语句,真正体现我们人类聪明才智的地方在于,我们做很少的事,计算机即可做很多事,人类在这中间扮演了一个指挥官的角色,这正是发挥计算机巨大潜力的地方。
分析本案的已有线索和将要的结果
对于上面的案子,老K要做的其实很简单,他要根据三个证人的信息,得出一个汽车牌照的号码来。所以老K的已知和结果就有了(图4)。中间的②部分就是后面我们要努力完成的。下面我们先来看一下①和③如何解决。③比较简单,只要用一个输出语句输出出来就行了。我们假设车牌号码是n,重点是①。
①包含了三个条件,三个条件可以这样描述:
(1)n是个四位数
从该条件中我们知晓,这个数是界于0001~9999之间的,用条件来描述即
1= < n<=9999
(2)四位数n前两个数位相同
要表达n的前两位数字,已知该数是n,要用到一点技巧,需先将其前两个数位从n中分离出来,怎样分离呢?
通过观察不难发现如下的特点,该数的左边第一位数,即最高位上的数除以1000后,得到的整数部分正是该数。我们设它为a,则有
a=INT(n/1000)
左数第二位如何呢(假设为b)?
可以利用上面的特点和上面得到的a,所以有如下关系:
b=int((n-1000*a)/100)
这个关系有点复杂,需仔细看看。
找出这两个数位来了,则这一步可表示如下:
a=b
(3)四位数n后两个数也相同
同上面分析第二位时一样,第三位上的数c有如下特点:
c=int((n-1000*a-100*b)/10)
第四位(即最低位)上的数d如下:
d=n-a*1000-b*100-c*10
有了c和d,则(3)表示如下:
c=d
(4)四位数n是某一整数的平方
从上面的条件得知,n既然是某一整数的平方,则开方后得到的一定是整数,所以该条件可表示如下:
sqr(n)=int(sqr(n))
处理过程
通过上面对条件和结果的分析,处理过程也就明确了,我们让电脑做的工作是什么呢?实质上就是将n定在0001~9999的范围之间,我们将n分成4个数位,a,b,c,d,将符合 a=b,c=d且sqr(n)=int(sqr(n))的数找出来。因为数非常多,并且特点相似,所以要用到循环(如图5),循环多少次呢,1-9999,9999次。
我们的重点问题成了图5①,将符合三条件的n的结果输出。要根据条件输出,必须先有条件,才能输出,所以该问题又可分成两大部分(图6示):
(1)求出塑造条件用到的a,b,c,d四个量。
a,b,c,d在上面已经求出。
(2)据三个条件判断输出。
所以这一步成了我们要重点解决的问题。
因为针对某一个四位数n,可能有两种情况,是车牌号或不是,所以此处是一个分支的情况,条件正是上面已做出的三个条件的综合,在条件成立一方输出结果,不成立一方则什么也不用做。
图7是对(1)和(2)的详细描述。
组合各图
将处理过程分析完,我们的程序的图示也就有了(就是图8)。我们只要将图4、5,6、7进行有效的组合,将图7放入图5的①位置,整修程序的N—S图就完成了。从图中,我们看到图4中的①和③消失了,只剩下②了。其实它们并没有消失。对于①来说,他已融入了图7的前半部分和后面的条件中,而③在分支中提前出现,所以后面就没必要再保留它了。
动手做程序
(1)语言
程序中通过Virual BASIC6.0语言来实现。
(2)界面
界面非常简单,建立一标准EXE工程,其caption设为“车牌号码之谜”,一切OK。我们将代码加给Form_Click()即窗体的单击事件,将来运行时,我们只要用鼠标单击一下窗体,程序就执行了。
(3)源程序
因为N-S图是编程的思路,写程序可参照它来完成:
写源程序时要把握好N-S图表示的整体结构关系,该程序整体上,就是一个循环,循环体部分可分成两大部分,上面是几个顺序语句,下面则是一个分支语句,分支语句按条件过滤我们需要的结果,我们在其中输出结果就OK了。下面是源程序,最主要的代码是子程序中的:
Option Explicit
Dim n As Integer'声明变量
Dim a, b, c, d As Integer
Private Sub Form_Click()
'程序中的主要代码如下
For n = 1 To 9999
a = Int(n / 1000)
b = Int((n - 1000 * a) / 100)
c = Int((n - 1000 * a - 100 * b) / 10)
d = n - a * 1000 - b * 100 - c * 10
If a = b And c = d And Sqr(n) = Int(Sqr(n)) Then
Print n'输出号码n
End If
Next n
'以上为程序中的主要代码
End Sub
(以上程序在VB6、 Win2000下调试通过)
这样我们便帮老K查出了车牌号码,号码只有一个,是“7744”。它是符合前、后两位均相同的特点,并且是88的平方,正好符合上面的三个证人的条件。看样子就是它了。







