程式演義第一二回 韋達破敵魔法助陣,解題阿蘭公式立功

大大老狼發表於2016-07-17

上節講到撒旦在耶酥的手下載了跟頭,但最終還是死可瞑目了,因為他找到了問題的真相。我們將繼續我們的程式之旅,穿越時空,回到法國,去見識一下一位號稱“代數學之父”的人物。
本回想說的是,其實解題的方法有多種。

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中。將上面的甲組重設為乙組重,可通過類似的方法來分析出那個不一樣的球來,但都不會多於三步!

相關文章