牟曉東
“雞兔同籠”趣題最早記載于1500多年前的中國(guó)古代數(shù)學(xué)著作《孫子算經(jīng)》中的“卷下”第31題(后傳至日本演變?yōu)椤苞Q龜算”),原題為:“今有雉兔同籠,上有三十五頭,下有九十四足,問(wèn)雉兔各幾何?”意思是“雞和兔的總頭數(shù)是35,總腳數(shù)是94,雞和兔各有幾只?”。
1.問(wèn)題求解
假設(shè)雞有x只,兔有y只,根據(jù)題意列方程為:
x+y=35,2x+4y=94。
求解,得:x=23,y=12;即雞有23只(46只腳)、兔有12只(48只腳)。
2.Python編程求解
如果使用Python語(yǔ)言來(lái)編寫程序的話,可使用for循環(huán)、range()函數(shù)和if條件判斷來(lái)完成。先使用“heads = 35”和“feet = 94”兩個(gè)賦值語(yǔ)句,保存雞和兔的總頭數(shù)和總腳數(shù);接著使用range()函數(shù)進(jìn)行for循環(huán),讓雞的數(shù)目從1開(kāi)始計(jì)數(shù)加1循環(huán),循環(huán)體中的if條件為“2*x + 4*y == feet”,即“雞數(shù)目的兩倍加兔數(shù)目的四倍之和等于總腳數(shù)”,條件成立的話,使用print語(yǔ)句進(jìn)行最終雞兔數(shù)目的輸出。保存程序?yàn)椤半u兔同籠1.py”,運(yùn)行結(jié)果顯示為“雞有 23 只,兔有 12 只?!保ㄈ鐖D1)。
3.升級(jí)版的“雞兔同籠”
考慮到“雞兔同籠”原題中所給出的總頭數(shù)和總腳數(shù)是固定的35和94,因此最終的求解也是固定的“23只雞、12只兔”。如果將題目進(jìn)行“升級(jí)”,雞和兔的總頭數(shù)與總腳數(shù)均由用戶從鍵盤輸入,仍然來(lái)求雞和兔的數(shù)目,應(yīng)該如何編寫程序代碼呢?
首先使用標(biāo)準(zhǔn)輸入函數(shù)input來(lái)接收用戶從鍵盤上輸入的信息,比如“heads = input('請(qǐng)輸入雞和兔的總頭數(shù):')”和“feet = input('請(qǐng)輸入雞和兔的總腳數(shù):')”。但在此需要特別注意的是,Python的input函數(shù)接收到的輸入數(shù)據(jù)是str字符串(雖然表面上看是數(shù)字),必須要使用int來(lái)轉(zhuǎn)換成整數(shù)型才能進(jìn)行數(shù)學(xué)運(yùn)算,語(yǔ)句為“heads = int(heads)”和“feet = int(feet)”。
接下來(lái)仍然是使用range()函數(shù)進(jìn)行for循環(huán):“for x in range(0,(heads+1))”。此時(shí)要充分考慮到用戶所輸入數(shù)據(jù)的計(jì)算結(jié)果,很有可能會(huì)出現(xiàn)“只有雞”或“只有兔”的情況。舉例:用戶輸入的總頭數(shù)是10、總腳數(shù)是20,運(yùn)算結(jié)果就應(yīng)該是“10只雞、0只兔”;或輸入總頭數(shù)是10、總腳數(shù)是40,運(yùn)算結(jié)果則是“0只雞、10只兔”。因?yàn)樵谟?jì)算機(jī)編程語(yǔ)言中,數(shù)字0總是被看作是最起始的值,Python的列表、字符串和元組等的元素均是從0開(kāi)始進(jìn)行索引的。不管是“0只雞”還是“0只兔”,在計(jì)算機(jī)看來(lái),這都是“雞兔同籠”,只不過(guò)數(shù)目是0而已。另外,由于range()函數(shù)的兩個(gè)參數(shù)是“左閉右開(kāi)”型的區(qū)間,即第一個(gè)參數(shù)是被計(jì)算在內(nèi),而第二個(gè)參數(shù)卻是不包括在內(nèi)的(只計(jì)算到它的前一個(gè)元素);所以,第二個(gè)參數(shù)應(yīng)該設(shè)置為“heads+1”,這樣就能在循環(huán)時(shí)計(jì)算到它的前一個(gè)元素(即“heads”),也就是“0只兔”的情況(“x=0”則是“0只雞”)(如圖2)。
循環(huán)體與之前類似,仍然是if條件判斷“2*x + 4*y == feet”是否成立,成立的話則使用print輸出結(jié)果,然后使用break語(yǔ)句跳出循環(huán)。因?yàn)椴淮_定用戶從鍵盤上輸入的兩個(gè)數(shù)據(jù)是否恰好為“有效解”——雞和兔的數(shù)目必須是整數(shù)只,所以在循環(huán)體外應(yīng)該再添加一個(gè)“if 2*x + 4*y != feet”判斷語(yǔ)句,將這種無(wú)法進(jìn)行整數(shù)結(jié)果計(jì)算的情況進(jìn)行提示:“輸入的總頭數(shù)和總腳數(shù)不合法”。沒(méi)有該print語(yǔ)句的話,程序也能正常運(yùn)行,但對(duì)于這種“意外”沒(méi)有任何提示,程序缺少必要的友好性(如圖3)。
最后將程序保存為“雞兔同籠2.py”,運(yùn)行幾次進(jìn)行測(cè)試,輸入的總頭數(shù)和總腳數(shù)包括原題目中的“35、94”、雞兔各為0只、“30、110”四種合法數(shù)值,程序均輸出了正確的計(jì)算結(jié)果;最后一個(gè)測(cè)試輸入“8、100”,結(jié)果就提示“輸入的總頭數(shù)和總腳數(shù)不合法”(如圖4)。