趣味数学编程题解之一位在需要时的朋友
IT商界
编程是为解决实际问题的。这是我们编程的原则之一。
正是因为解决实际的问题,生活中的常识和约定在编程过程中我们就不得不遵守,而这些正是我们编程的过程中容易忽略的。
编程的过程中不确定性的信息或者常识也可用来当做条件,并且这往往容易被忽略。下面就是一例,是关于年龄的一个故事。
年龄故事:一位在需要时的朋友
点燃雪茄后约翰靠回到自己的椅子上,他显得对自己的生活很满意。“是的,”他开怀地笑着说,“在三十年前,当我们在一起还是十几岁孩子的时候,我绝没有想过后来会过得这么好。”
他的来访者微微笑了笑。在过去那些日子,他们曾是好朋友,但那是很久以前的事了。今天当他急需一份工作的时候,这种深厚的友谊又有什么价值呢?“你的两位兄弟怎么样?”他问道,“他们都比你年轻是吗?”
约翰点点头:“干得不错。本恩,就是最小的那个,已有近百万家产。而泰德,就是原先爱耍小聪明的那个男孩,现在家住华盛顿。比尔,你过去好像在计算上挺在行的,看看这样一道问题怎么样?”
这位大亨潦草地写着他的问题,而比尔却在充满希望中等待了几分钟:“本恩的年龄乘以我和泰德年龄的差,比我的年龄乘以他们之间年龄的差恰好少1。这里年龄都是取整年算的。” “太糟了,”比尔伤心地摇头道,“我本打算来你这儿求份工作,却没想到你倒向我推销自己的计算能力!”
比尔自然得到了工作。然而,找出那三个人的年龄无疑会给你带来快乐。
题目分析
对于这里面提到的年龄,虽然题目很长,但所有的条件基本上都在这句话中了:“本恩的年龄乘以我和泰德年龄的差,与我的年龄乘以他们之间年龄的差恰好少1。这里年龄都是取整数年算的”,这里的我自然指的是约翰。
我们对他们几人的年龄从故事中应该了解一些,他们是三十岁到六十岁。三人中,本恩是年龄最小的,又因为年龄取整数算,故另外两人的年龄至少比本恩的大1。
编程简析
三个人的年龄大体有个范围,不过不是很确定,我们选取在30~60之间,所以可能的方案有31×31×31种,因本恩是年龄最小的,在循环中我们可以将这个特点突出出来。假设三人的年龄是a1、a2、a3,则a1的范围是30到59,而a2的范围是a1+1到60,a3也是a1+1到60。这样一来,年龄的可能方案的数量将被大大减少。
而所有方案中我们如何取舍呢?自然是用到约翰的话所代表的条件。也就是a1*abs(a2-a3)+1=a2*(a3-a1)。为了使上述表达式更加简洁,我们将求绝对值的部分abs(a2-a3)单独作为一个语句。其N-S图如图所示。
语言、界面、源程序
(1)语言
程序中通过Virual BASIC6.0语言来实现。
(2)界面
界面非常简单,建立一标准EXE工程,其caption设为“朋友年龄”,一切OK。我们将代码加给Form_Click()即窗体的单击事件,将来运行时,我们只要用鼠标单击一下窗体,程序就执行了。
(3)源程序
Option Explicit
Private Sub Form_Click()
Dim a1, a2, a3, n As Integer
For a1 = 30 To 59 '本恩年龄
For a2 = a1 + 1 To 60 '约翰年龄
For a3 = a1 + 1 To 60 '泰德年龄
n = Abs(a2 - a3)
If a1 * n+1 = a2 * (a3 - a1) Then Print "本恩\约翰\泰德年龄分别是:;"; a1; ","; a2; ","; a3
End If
Next a3
Next a2
Next a1
End Sub
(以上程序在VB6.0 Win2000下调试通过)
编程小结
在上面我们选择的年龄范围内,一共有两组值,分别是:
本恩\约翰\泰德是: 32,57,41,
本恩\约翰\泰德是: 35,44,39
(1)两组值的原因
这里结果有两个,之所以有两个结果,和题目中不确定的条件是有关系的。约翰的这句话,“在三十年前,当我们在一起还是十几岁孩子的时候,我绝没有想过后来会过得这么好。”其实就是一个范围不很确定的条件。而约翰的另一句话,也就是上面作为条件的那一句话,如果不按照数学上的意思硬推理的话,也许还有另外一种条件的理解:a1*abs(a2-a3) =a2*(a3-a1)+1。这样得到的结果可能又不同。
我们选择的范围不同,结果也是不同的。因为题目本身的约束条件就不是很确定的,这也给我们编程带来了难度,如果范围过大,则可能结果太多,范围太小的结果则是没有答案的。
(2)利用条件使循环次数更少
题中我们可以执行31*31*31=29791次,也可执行比这少得多的次数,方法就是对循环的起始变量重新进行定义,通过对题中的年龄大小进行限制,只要执行30*30+29*29+28*28+…+1*1=9455次问题就解决了。
(3)编程是为解决实际问题的
编程是为解决实际问题的,这也是我们在编程时需重点注意的一个问题,实际问题中的有些限定条件,有时还是要考虑的。常识需要据自己现有的知识灵活地去把握。下一期我们还将介绍一个类似的例子。
