上节讲到撒旦在耶酥的手下载了跟头,但最终还是死可瞑目了,因为他找到了问题的真相。我们将继续我们的程序之旅,穿越时空,回到法国,去见识一下一位号称“代数学之父”的人物。
本回想说的是,其实解题的方法有多种。

enter image description here 图:韦达

2.12.1 P12韦达密码x2-25x+156
韦达 (1540-1603年,Viete,Francois),是法国十六世纪最有影响的数学家之一,第一个引进系统的代数符号,并对方程论做了改进。
 他生于法国的普瓦图。年青时学习法律当过律师,后从事政治活动,当过议会的议员,在对西班牙的战争中曾为政府破译敌军的密码。韦达还致力于数学研究,第一个有意识地和系统地使用字母来表示已知数、未知数及其乘幂,带来了代数学理论研究的重大进步。韦达讨论了方程根的各种有理变换,发现了方程根与系数之间的关系(所以人们把叙述一元二次方程根与系数关系的结论称为“韦达定理”)。
在法国和西班牙的战争中,法国人对于西班牙的军事动态总是了如指掌,在军事上总能先发制人,因而不到两年功夫就打败了西班牙。可怜西班牙的国王,对法国人在战争中的“未卜先知”十分脑火又无法理解,认为是法国人使用了“魔法”。原来,是韦达利用自己精湛的数学方法,成功地破译了西班牙的军事密码,为他的祖国赢得了战争的主动权。另外,韦达还设计并改进了历法。所有这些都体现了韦达作为大数学家的深厚功底。在其中的一次战争中,西班牙的作战的时间藏在了一个式子x2-25x+156=0中,问题也就出来了:如何破解类似的形如a x2+bx+c=0类的式子,帮助法军提前知晓作战时间呢?

2.12.2 破译韦达密码:
破解密码,还是通过我们前面的五步分析法,但解题之前我们必须先熟悉韦达发现的定理,即a x2+bx+c=0的解由a、b、c三者的关系决定,在保证前面式子是一个一元二次方程,即a不为零的前提下,可由△=b2-4ac决定根,如果△>0,则有两个不同的根;如果△=0,则有两个相同的根;如果△<0,则没有根。下面我们可以解题了。
第一步:三积木
这是最简陋一个图形,请先画上一个“目”字形,也是最基本的一步。
第二步:做头尾
上面的三部分,先分析开头和结尾部分,开头是什么呢?题中的已知可输入条件,也就是a,b,c,结尾是什么呢?处理完成后的结果,一眼看不穿,情况比较多,数一下上面的定理,总计有四种情况,但我们输入一组a,b,c的值,总会有四种可能中的一种出现(如图1示)。

enter image description here

第三步:连头尾
如何将开头和结尾连接起来呢?四种情况选择一种出现,是分支的情况,先将其总结成两种,即符合韦达定理的和不符合韦达定理的,分类通过什么呢?a的值,a=0时不符合,否则符合(如图3示)。
符合的情况根据韦达定理可分成两大类,两个根的,和没有根的。
下面还要对没有根的继续求,根据公式,可分别求出来(如图4)。
后面还需要对各部分进行求解(如图5示)。
enter image description here

第四步:贴语法
各个语句和具体语言的语法还有一定的差距,根据相应语言,还要再行将相应语句转化(如图5示)。值得一提的是△,因为题中不可能用他表示变量,必须以原有的面目代表它,即b*b-4*a*c
第五步:写代码
下面可以写代码了,本题的代码相对来说也比较复杂,要注意各个分支语句之间的包含关系。

input a,b,c
if a>0 then
print “Bu Shihe Dingli”
else
if b*b-4*a*c>=0 then
if b*b-4*a*c>0 then
x1=(-b+sqr(b*b-4*a*c))/(2*a)
x2=(-b-sqr(b*b-4*a*c))/(2*a)
print x1,x2
else
x1=-2*b/a
print x1
else
print “Wu Jie”
end if
end if
(上程序在QB下调试通过)

2.12.3 阿兰开讲
计算机语言中,分支语句是我们应对现实问题的强力武器,通过它,可以将这个世界归成很多种类,然后一个一个解决掉。但现实问题的解决,在理清脉络之前,是不可能用电脑解决的,这种脉络,很大程度上我们可以利用前人的成果,韦达研究的意义正在于此。
前人还为我们总结了不少东西,许许多多优秀的科技成果,定理,定律等等,为什么不用呢。按理说,我们只要有这两种语句就足够了,但实际上是不够的。那么,除了分支,还有什么方法我们在编程中可以利用呢?欲知后事如何,且听下节分解 。

2.12.4 小测验:12小球问题
有十二个小球,有一个质量和其它十一个不一样,不知道是重还是轻。用一个天平称三次,把这个质量不同的球给区别出来。

小测验参考答案: 将12个小球从1-12编上号,四个分成一组,为甲1-4,乙5-8,丙9-12,总计三组。
先取甲乙两组放在天平两边,有两种结果,要么相等,要么不等。
如果甲乙两组相等,则那个不同的球一定在丙组,取甲组的任意三球与丙组的9,10,11号放入天平,又出现两种结果:如果相等,则证明球就是12号,再用天平称一次可判断其轻重;如果不等,则可判断其轻重了,一定是在9,10,11三个球中,取其中两个上天平,又出现两种情况,如果相等,则证明是第三个,如果不等,则是和前面的轻重关系相同的一个。
如果不等,要记下其轻重关系,这是后面分析的基础,假设是甲组重,刚将甲组的1,2和乙组的5,甲组的3,4和乙组的6分别组成两组,放入天平,又出现两种结果。如果相等,则不同的球在7,8号中,且是轻的,第三次只要将7,8放在天平上就可知哪个轻是哪个;如果不相等,且是1,2,5这一边重,那第三步拿1,2称,如果1,2两球相等,则不同的球是6号,且是轻的,如果1,2不相等,那不同的球是重的,就在1,2中。将上面的甲组重设为乙组重,可通过类似的方法来分析出那个不一样的球来,但都不会多于三步!