1. 程式人生 > >Linux腳本基礎篇-雞兔同籠問題

Linux腳本基礎篇-雞兔同籠問題

NPU alien ffffff 資源 小學 ces water linu 現在

概述


雞兔同籠,是古代著名典型趣題之一,記載於《孫子算經》之中,題目為“有若幹只雞兔同在一個籠子裏,從上面數,有35個頭,從下面數,有94只腳。問籠中各有多少只雞和兔?”。雞兔同籠問題,是小學奧數的常見題型,也是計算機編程算法中常見的一道題,現階段開始shell腳本的學習,因此不妨用腳本來嘗試編寫一個計算該問題的腳本,加深自己對Linux shell腳本的理解。

算法

在做一道數學題之前,思路是極為重要的,自己如何解決這道題,怎麽按照計算機語言的思維來幫助我們計算就成為了首要之重。我們明白,這是一道典型的二元一次方程,假設兔子為x,雞為y,得到方程(1) x+y=35;(2) 4x+2y=94,(2)-2*(1)即可得到2x=24,x=12的值,從而得到y=23,但是我們如何用腳本語言中表達出意思呢?

題目中給出的量是35個頭,94只腳,要求計算的是兔子和雞的數量,因此我們可以將兔子和雞看作是計算機要計算的數,頭和腳是需要手動輸入的數,不能說是題目給94,35,做出的腳本就只能按照94和35計算吧,那未免也太浪費資源了吧?

網上有很多的思路,不過我們可以看到,上述方程(2)除以2再減去方程(1)也就可以得到一只小動物的數量了,所有我們的思路是設定變量feet為腳的數量,設定變量head為頭的數量,因此就可以有$feet/2-$head 就可以出來一鐘小動物的數量,余下的用$head的值去減,另外一只小動物數量也隨之而出了。

編程


在得到上面的思路後,編程可以開始了,第一步,讓某某人輸入頭的數量和腳的數量

read -p "input the sumheads:" head

read -p "input the sumfeet:" feet

#輸入一共有多少個頭,多少只腳


好了,接下來我們就可以擺數字計算了嗎?No!計算機思維沒有像我們人類思維天生帶限制範圍,稍微一不註意就報錯,所有第一步還是檢查輸入的是不是數字吧!

[[ "$head" =~ ^[1-9][0-9]*$ ]] && [[ "$feet" =~ ^[1-9][0-9]*$ ]] || { echo wrong format; exit; }

#檢查輸入的任意一個值是否為數字,不是的話報錯誤格式並退出,退出是整個腳本退出,不是當前命令退出繼續執行,因此使用花括號括起來


可以確定數值是有了,可是現在還不夠,如果是惡意輸入呢?頭比腳多呢?雞腿都被肯德基老爺爺拿去做套餐了?所以再來一步吧,保險些

[ "$head" -gt "$feet" ] && { echo input the corrected number; exit; }

#檢查輸入頭的數量是否大於腳的數量,如果大於,報錯誤的數值


這下總該千呼萬喚shi出來的擺算式了吧?那麽,好的

chicken=$[$[$feet/2]-$head ]

rabbits=$[$head-$chicken]

############################

c=$[$chicken*2]

h=$[$rabbits*4]

tmp=$[$[$c+$h]/$feet]

如果說'#'之上的能看作根據之前思路列出的算式,那麽下面的是幹什麽的?答:自己想去吧


不難發現,'#'之下的$tmp作為一個臨時變量,計算意思是計算出的腳的數量除以輸入的腳的數量,做這個是為了發現輸入的數值是否符合正常運算,說到底還是在看是不是失誤輸入,全部碼為

chicken=$[$[$feet/2]-$head ]

rabbits=$[$head-$chicken]

c=$[$chicken*2]

h=$[$rabbits*4]

tmp=$[$[$c+$h]/$feet]

[ ! "$tmp" == 1 ] && echo there must be some alien steal my beasty

#檢查輸入,如果值為1說明給出頭和腳的數量是搭配的,否則給出提示語,計算的值也可能不是所要的答案


輸出結果表示上

echo chicken= $chicken

echo rabbits= $rabbits


ok,也算是勉勉強強算出來了,shell腳本不支持小數點,本來還想分別對$tmp>1和$tmp<1的情況做出不同解釋不同運算,或許目前我的水平還不知道是否可以存在0<$tmp<1的情況,這下對於我而言$tmp<1情況算是涼了,最後附上各種輸入的情況

技術分享圖片



Linux腳本基礎篇-雞兔同籠問題