趣味数学编程题解之乘车兜风算年龄
IT商界
编程是为解决实际问题的,对题目中常识的理解不同,得到的结果就会不同。
我们在上期的《朋友年龄》中得到了几组值,下面的题目又会是一种什么情况呢?同样是年龄问题,还有一个常识的问题,所谓常识,是指题目中没有明确提到,我们可当作条件来用。下面还是一个关于年龄的题目。
年龄趣题:乘车兜风
“你在忙什么,比尔?”教授随组地说。这时他的这位朋友正一口气喝完剩下的咖啡,站起来要走。
“准备带三个女孩乘车游览!”比尔答道。
教授笑了:“原来如此!敢问三位佳丽芳龄几许?”
比尔思考片刻说:“把她们年龄乘在一起得到2450,可她们年龄和恰是您年龄的两倍。”
教授摇了摇头说:“非常有趣,但对她们的年龄仍然有疑问。”
比尔还在那里,他补充道:“是的,我忘了提起,我的年龄至少要比那个岁数最大的小一岁。”而这使得一切都变得清楚了!
当然,教授是知道他朋友的年龄的,请问,你能算出她们的年龄吗?
用电脑如何去算出她们的年龄呢?
问题分析
既然是三个女孩,她们的年龄应该不会超过25岁吧,或者开放一点,不超过30。所以有一个年龄的范围1~30岁。再就是教授的年龄,教授是一个人,我们想象他是地球上最大的人,那么最大也就120岁了。有了上面的两个范围,编程的一些具体问题就好解决了。
为了算年龄,我们算几个人的呢,三个女孩的,比尔的年龄可以做为条件,可是我们不知道,只好用上面按常理来猜的两个条件了。
程序实现
在三个女孩的年龄范围内,从他们年龄的所有可能方案中自然就能找出那个可能的范围。这要用到三个年龄的循环。范围内怎样找出我们最需要的呢?通过上面所列的条件就可完成了,最重要的一个是她们年龄乘在一起得到2450,教授的年龄也可看做一个条件,但有了上面关于人的最大年龄的假设,这个条件还是不能忽略的,最大假设是30,三个人90岁,但三个人年龄和的两倍将达到180,这应该是不可能的,常识中最大的值是120岁。所以在题中用到的两个条件如下,必须两个条件全部符合时才是我们要的结果:
①a1 * a2 * a3 = 2450
②(a1 + a2 + a3) * 2 < 120
为了使选择的方案不至重复,对循环可再加以限制,第二个的年龄的选择必须要大于等于第一个的年龄,第三个的年龄大于等于第二个。
其N-S图如图1所示。
语言、界面、源程序
(1)语言
程序中通过Virual BASIC6.0语言来实现。
(2)界面
界面非常简单,建立一标准EXE工程,其caption设为“乘车兜风”,一切OK。我们将代码加给Form_Click()即窗体的单击事件,将来运行时,我们只要用鼠标单击一下窗体,程序就执行了。
(3)源程序
Option Explicit
Private Sub Form_Click()
Dim a1, a2, a3 As Integer
For a1 = 1 To 30 '最小女孩年龄
For a2 = a1 To 30 '中间女孩年龄
For a3 = a2 To 30 '最大女孩年龄
If a1 * a2 * a3 = 2450 and (a1 + a2 + a3) * 2 < 120 Then
Print "三女孩年龄从大到小依次是:;"; a1; ","; a2; ","; a3
Print "比尔的年龄大于"; a3
End If
Next a3
Next a2
Next a1
End Sub
(以上程序在VB6、Win2000下调试通过)
编程小结
程序一运行,一组数据,三个女孩的年龄分别是7,14,25。
(1)只有一组结果的原因
本题中比较难办的一点即是“什么是女孩?”,另一个容易忽略的问题是教授的年龄,教授是人,就不应该超过我们为人类设的年龄的最大限制120。概念不同引出的年龄范围是不一样的,范围太大,找出很多组数据,太小,没有合适的了,这同样是一个现实问题或者说常识。
(2)为循环加上限制,减少循环次数。
另一个问题是如何求出最大、中间和最小的年龄,我们可以先找出可能值然后再比较,那无疑会增大工作量。在循环的条件上做了一下手脚,这个问题就解决了。
(3)常识作为隐藏的条件,编程时尤其要注意。
题中有两个常识问题,即人的最大年龄<=120和“女孩”(也可看作常识吧)一词的出现,常识问题还是要知晓的。条件有时虽不在题中,可不能难倒我们,更不能因此而闹出笑话。
(4)条件除了要找,还要学会创造与猜测,要在条件的综合过程中找出规律来。
前面所讲的题目中的条件大都是在题中的,不论是多还是少,是确定还是不确定,是明显的还是隐蔽的,总之在题中是能找到的。但有时仅仅做到这一点还远远不够的。还要学会创造条件,要敢于猜测。后面将有这方面的事情发生。
为了使我们暂时从条件的阴影中走出。下一期我们将看一个比较有意思的填空游戏,我们不再用单一的条件比较,而要在多个条件中总结和挖掘规律。
