趣味数学编程题解之到底有多重

IT商界

  上一期的《赌博游戏》中条件多得有点烦人,遇到条件过少的情况怎么办呢?同样也比较烦人。烦人过后,仔细分析一下,将隐藏在其中的条件挖出,题目解出了,也就不烦了。

  本期是一道有意思的趣味数学题,关于体重的。上期是多条件的情况而本期,走上了另一个极端,条件很少。本题的条件少到只有一个表达式,看看你能不能把它做出来。

  题目:到底多重

  已经知道四个小朋友甲、乙、丙、丁的体重都是整数公斤, 且 甲<乙<丙<丁, 又四人中任两人的体重和如下:

  35 39 44 45 50 54

  请计算一下甲乙丙丁的体重各自究竟是多少?

  题目分析

  就这么一个关系表达式,怎么解决这个问题呢?四个人的体重有一种从小到大关系,将四个人的两两关系找找,总计有3+2+1=6种,再和两人的体重对比一下。下面的是任意两人的值,从大小关系中我们不难得出下面的两体重的大小关系:

  ①甲+乙<②甲+丙<③甲+丁或④乙+丙<⑤乙+丁<⑥丙+丁

  在上述关系式中,中间的两个和值(即③和④)彼此之间大小是不确定的,但它们和其他的关系是确定的。有了这种确定和不确定,我们可得出数值和人的体重的对应关系如下:

  (1)最小的体重关系:①甲+乙=35

  (2)最大的体重关系:⑥丙+丁=54

  (3)中间的两组体重关系:

  ②甲+丙=39

  ⑤乙+丁=50

  (4)不确定的两组体重关系,但每次只能一组有效

  第一组:③甲+丁=44并且④乙+丙=45

  第二组:③甲+丁=45并且④乙+丙=44

  如何编程

  有了上面的分析,我们可确定四个值的大体范围,假设用a1、a2、a3、a4来表示甲乙丙丁的体重,则它们的范围被限定在一组确定的值之内。

  (1)甲的体重范围:a1在1到17范围内

  因为甲与乙的和是35,且甲<乙,就使得甲最大只能是17。

  (2)乙的体重范围随着a1而变化:a2=35-a1

  上述两结论是对2(1)(表示“题目分析”中的(1))关系条件的综合利用。

  (3)丙的体重范围:a3在3到27内

  (4)丁的体重范围随着a3而变化:a4=54-a3

  上述两结论是对2(2)条件的综合利用。

  虽然是四个人,通过上面的分析不难看出,用两个循环就可将上面的四部分表达出来,但这样还没有将我们在题目分析中所提的条件全部表达出来。必须在循环的内部利用剩下的两个条件,即2(3)和2(4),再通过分支可将两条件形象地表达出来,分别为:

  2(3):a1 + a3 = 39 And a2 + a4 = 50;

  2(4):(a1 + a4 = 44 And a2 + a3 = 45) Or (a2 + a3 = 44 And a1 + a4 = 45)。

  同样是体重,有的通过循环来实现该条件,而有的则通过分支语句实现该条件,其中的区别,值得我们好好体会一番。N-S图如图1所示。

  另类解法

  如果没有上面的分析,程序就变得复杂多了,我们可以以最坏的情况去进行思考,还是选择a1、a2、a3、a4代表四个人的体重,体重的可能范围均是1~54,而如何将这54×54×54×54种方案中选择出哪一组或几组符合条件的呢?

  条件变得异常多,必须符合:①a1<a2<a3<a4且②a1,a2,a3,a4两两组成的六组值和题中所列的六组值相似。其N-S图的大体结构如图2所示,图中后面的两大组条件和前面的分析类似。

  可看出第二种解法比第一种解法要麻烦许多。

  语言、界面、源程序

  (1)语言

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

  (2)界面

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

  (3)源程序

  下面的源程序是针对图1的解法的。

  Option Explicit

  Dim a1, a2, a3, a4 As Integer

  Private Sub Form_Click()

   '主要代码如下

  For a1 = 1 To 17 '甲

   a2 = 35 - a1 '乙

   For a3 = 3 To 27 '丙

     a4 = 54 - a3 '丁

   If a1 + a3 = 39 And a2 + a4 = 50 Then '条件2(3)

    If (a1 + a4 = 44 And a2 + a3 = 45) Or (a2 + a3 = 44 And a1 + a4 = 45) Then '条件2(4)  

   Print a1, a2, a3, a4 '输出

    End If

   End If

   Next a3

   Next a1

  End Sub

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

  编程小结

  编程中分析原题中给出的条件是十分重要的。这些条件要综合利用,最好对它们的规律进行一下总结,然后再利用,不要急于下手,等将条件看明白了,并将条件分析得有条有理了,然后下手,这样往往起到事半功倍的效果。

  结果非常简单:15,20,24,30就是这几个数字。

  (1)条件少时怎么办

  这个题目中给出的条件很少,就一个大小关系式和一组值,它们中的关系和联系需我们去默默地分析,分析出来了,解答方法也就有了。其实有时条件表面上少,并不代表真正少,要善于挖掘其隐藏的条件。

  (2)动手之前先三思

  编程时,拿到题目先分析,不管条件多还是少。多了要将无用的去掉,还要理出可能有的时间关系;条件少了,也不能着急,看看条件中有没有值得发掘的东东,挖出来了,解答方法也就出来了。下一期故事也是讲解如何巧用条件的。当条件不多,也不少,那解答难度究竟如何呢?条件还会出现第三种情况。