趣味数学编程题解之盲人裁判的判断

IT商界

  本期的题目非常简单,说了一个盲人如何当裁判的故事,你可以用解方程的方法先手工算一下试试,然后好好思考一下如何通过编程来解决这个问题。再把两种方法对比一下,你会发现这是个挺有意思的问题:计算机思考和人的思考究竟区别在哪里?

  盲人又看不见,如何当裁判呢?可就是有这么一位盲人在裁判一场比赛,并且他还是位出色的裁判……

  题目:盲人裁判

  甲、乙两人在游乐室进行实弹射击,打气球,裁判员却是一位盲人。

  裁判:“请问你们俩已经把10只气球都打破了吗?”

  甲、乙:“是的,都打破了。”

  裁判:“请甲先生把你打掉的气球数乘以2,请乙先生把打掉的气球数乘以3,再把两个数加起来,请告诉我。”

  甲、乙:“26。”

  裁判:“那我已经知道你们俩各打掉几只气球了。”

  请你猜一猜甲乙各打掉了几只气球,盲人裁判是怎样知道的?

  题目分析

  盲人裁判不能看见打气球的情况,却可以根据两个比赛者的回答进行计算?正是如此。

  这个题目如果不通过电脑,我们如何做呢?

  设甲打破气球个数为a,自然乙就打破了(10-a)只,然后根据条件可列出如下方程:

  2a+3(10-a)=26

  将方程解出可得:a=4

  这是人类的解法,直接去找答案。

  我们用电脑又如何解决?显然不可能简单到直接输出4,这样用不用电脑就没有什么意义了。用电脑实质上也要计算,怎样计算呢?

  还是要把这道题分成三大部分:看看原始数据有哪些,再看看将来要得到的结果,通过这两者的分析,想想中间我们采用什么办法就能得出结果来。

  材料和结果

  题目中的材料很多,上面的所有数字都可以看做材料,都是我们寻求结果的依据,结果却异常清楚,两个人每个人打破了几个气球。可以设成甲打破a,自然乙就打破了(10-a)只。那么怎样将题目中的数据全都应用上来实现求出a的数值呢?我们只要知晓a自然就有了。

  用电脑来如何解题呢?

  如何根据材料得到结果

  a有好多可能,可能是0-10中的任何值,当然也可包括二者。值比较多,我们可用循环结构(如图1)。

  我们不难看到,电脑做题是在所有的可能方案中进行选择。但怎样判断这些值哪一些不符合条件呢?

  那只有从原题中找了,只要甲的a*2与乙的(a-10)*3二者的和是26,就说明a取对了。

  所以下面的问题,即图1①的问题就成了重点要解决的。它有两种情况,但只有一种符合我们需要,可以用分支来解决。

  条件就是上面的各式,如果符合各式,则输出a否则不用输出(如图2)。

  将图2和图1组合到一起,程序的N-S图就有了(如图3示)。

  语言、界面、源程序

  (1)语言

  程序中通过Visual BASIC6.0语言来实现。

  (2)界面

  界面非常简单,建立一标准EXE工程,其caption设为“盲人裁判”,一切OK。我们将代码加给Form_Click()即窗体的单击事件,将来运行时,我们只要用鼠标单击一下窗体,程序就被执行。

  (3)源程序

  从图3的N—S图中不难看到,程序的整体结构是一个循环,循环内部是一个分支。当条件成立时输出结果a,这个程序是比较简单的。源程序如下:

  Private Sub Form_Click()

  Dim a As Integer

  For a = 0 To 10

  If a * 2 + (10 - a) * 3 = 26 Then

  Print "甲"; a, "乙"; 10 - a

  End If

  Next a

  End Sub

  (上程序在VB6.0、Win2000下调试通过)

  编程小结

  结果出来了,甲4,乙6,4×2+6×3=26,说明这个答案正确。这个题目实在太简单。用一个方程三下五除二就干好了,用电脑有些麻烦。

  (1)电脑解题和人类解题方式不同

  这个问题正是我们编程的难点和有意思的地方,这可能也只有大师们才能解决的问题,我们仅仅做浅显的注解。人类善于直接通过思维推得结果,电脑则长于在大量重复的事实中通过笨拙的一丝不苟的努力来发现自己的目标。这也是人和机器的区别。

  (2)用好“区别”来解决问题

  找到这种区别,我们后面做题的时候,如果是通过编程的方式做,思维的变换是第一重要的;如果思考方式不发生改变,可能永远编不出程序来。