阿基米德临终留难题,海伦解题名扬天下

编程爱好者

“给我一个支点,我会搬动整个地球。”这是阿基米德的一句非常有名的名言。阿基米德(Archimedes,公元前287~212年)是古希腊物理学家、数学家,静力学和流体静力学的奠基人。罗马时代的科学史家普利尼把阿基米德誉为“数学之神”。公元前212年,罗马将军马塞卢斯围困并攻打西西里的叙拉古港,当马塞卢斯的军队蜂拥而入时,他告诉部下说:“任何人都不得斗胆对阿基米德妄动一个手指头,这人是我们的座上宾。”马塞卢斯的一个士兵在庭院中找到了阿基米德,当时,阿基米德正在沙地上画着一个三角形,这位士兵不自觉地拔出了剑,可阿基米德请求说:“我的朋友,在你杀死我之前,请告诉我怎样根据三条边的长度,将三角形的面积求出来好吗?”这位士兵再没有等待,拔出剑刺向阿基米德,阿基米德躺倒在地,喃喃地说:“他们夺走了我的躯体,但我将取走我的灵魂。”说完安然死去。

22-f16-1.jpg
阿基米德三角形

阿基米德去了,一个千年的难题也就丢下了:如何根据一个三角形的3条边求出它的面积呢?我们要做的还有一个简单得令人不屑的问题,如何求它的周长呢?

阿基米德三角未解之谜

第一步:树梯子

还是用我们的老办法,先做出一个“目”字形,这是最基本的一步(图1)。

22-f16-2.jpg
图1

第二步:做头尾

上面的三部分,先分析开头和结尾部分,开头是什么呢?题中的已知可输入条件,也就是三条边a、b、c。结尾是什么呢?处理完成后的两个结果,即周长l和面积s(如图2所示)。

22-f16-3.jpg
图2

第三步:连头尾

如何将开头和结尾连接起来呢?也就是a、b、c和s与l的关系,分成两部分,即求周长l和求面积s(图2),怎样求呢?周长最简单,简单得不像题目似的,将三边的值加起来就行了。面积呢,很难。怎么办呢?多亏在阿基米德去世大约三百年后,在希腊出了另一位奇人,他就是海伦。

海伦的三角形理论

海伦(Heron of Alexandria)是古希腊数学家、力学家、机械学家。海伦的主要贡献是《度量论》一书。该书共3卷,其中卷I第8题给出著名的海伦公式的证明,设三角形边长分别是a、b、c,s是半周长(即s=(a+b+c)/2),则有

22根号.jpg
22-f16-4.jpg
海伦先生反复强调:海伦公式的原作者是他本人

但海伦的三角公式,千百年来却逃不出阿基米德“牛”论的笼罩。有人说海伦公式是阿基米德发现的。那究竟这个公式应该属于谁呢?面对阿基米德数百年打压,海伦先生揭竿而起:“这个成果的确是我的!阿基米德不知道的。”

海伦三角形解题

我们接着来做,可得出图5中的结果。

接着第三步来:连头尾。

那么现在用海伦的理论,怎样分析呢?开头是什么呢?题中的已知条件,三条边a、b、c来表示。目标是什么呢?有两种可能,要么求出面积s和周长l,要么由于三条边不满足三角形的条件,而不能输出。这个输出比较难做,怎么办呢?暂且放一放,但应该弄清楚是两种可能出一种。

如何将开头和结尾连接起来呢?也就是建立“输入a、b、c”和“输出面积s和周长l,或因不符合三角形条件而不能输出”的关系,其特点是两种情况最终只有一种情况出现,所以用一个分支,就解决问题了!问题分成三部分,如图3中间所示。是否符合三角形的条件,符合情况下输出面积周长,不符三角形条件则输出“不能构成三角形”。

22-f16-7.jpg
图3

我们如何去应对这三部分呢(如图4)?

22-f16-8.jpg
图4

首先看条件,这是前所未有的复杂的条件,只有任意两边的和大于第三边,才可能是三角形,是三角形才可能求面积,如何做这种保证呢?因为只有三条边a、b、c,所以,上面的话翻译出来是:a+b>c且a+c>b且b+c>a。

然后看分支的左边,也就是条件成立时的活儿,这时,无非就是求三角形的面积(如图5所示)!就是阿基米德求法的结果。

22-f16-6.jpg
图5

最后看分支的右边,也就是不符合三角形的条件,这里要做的就更简单了,只要输出一种提示信息就行了。

第四步:贴语法

下面我们还用QBASIC语言来解这个题目。第三步中的各个语句和具体语言的语法还有一定的差距,根据相应语言,还要再将相应语句转化。一个是分支的条件,翻译成电脑语言,只要将“且”用and,一种表示并且的关系符号表示就行了;还有输出部分,两个输出都要转化成相应语句;公式的电脑语言化也要完成,保证在一行上,相关函数和括号用得准确(如图6)。

22-f16-9.jpg
图6

第五步:写代码

下面可以很简单地写代码了,最重要的是后面的一部分。整个图可分成两大部分,后面的一个分支作为一大部分,这部分复杂一点,上面的一部分原封不动照搬,下面按分支语句的结构做出来,程序也就有了:

所以代码如下:

input a,b,c

‘第一个分支

if a+b>c and a+c>b and b+c>a then

l=a+b+c

k=l/2

s=sqr(k*(k-a)*(k-b)*(k-c))

print s,l

‘第二个分支

else

print “BuNeng GouCheng Sanjiaoxing”

endif

(上程序在QBASIC下调试通过)

阿兰开讲

阿基米德给我们的最大启示是:解题要善于利用前人已有的东西。发明创造的素质是必需的,但是,现有的数学物理上的方法及公式,有时用一下,并不能泯灭我们的个性,相反地,会给我们的解题带来巨大的方便。后面我们还将奉献上这样一些有意思的题目,进一步来看一下分支结构的特点,但遇到问题时,千万脑筋要拐一下弯,毕竟,我们现在有了两种控制问题的有力工具:分支和顺序。欲知后事如何,且听下回分解。

小测验:分金条

如果让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你的工人付费?

上期小测验参考答案:

本题的解题关键还是理清时间脉络,下面看一下第N只猴子和面前桃子数的关系。

第N只猴 第N只猴前桃子数目

5 s5=x

4 s4=s5*5/4+1

3 s3=s4*5/4+1

2 s2=s3*5/4+1

1 s1=s2*5/4+1

s1即为所求。上面的规律中只要将s1-s5的下标去掉: s=x

s=s*5/4+1

s=s*5/4+1

s=s*5/4+1

s=s*5/4+1

上面求出的只是满足条件的最小正整数解,第五只猴子面前最少是6颗桃子,这样才能保证分成5份后还有一颗,但这一次保证了,下一次还不一定保证。所以,每次长5个,要试验多次。所以可能的范围是6-∞每次增加5,这样找比较烦。那究竟怎么办呢?上面的办法不太适合人干,可以考虑其他的方法。思路一转,有一个巧思妙想的解法:假若我们借来4个桃子,这样桃子数就可以连续5次平均分成5堆了。随着我们学习的深入,最终还是通过程序,会找到合适的结果的,如果倒着着推下去,不难发现这个值是1276。