概述算法
雞兔同籠,是古代著名典型趣題之一,記載於《孫子算經》之中,題目爲「有若干只雞兔同在一個籠子裏,從上面數,有35個頭,從下面數,有94只腳。問籠中各有多少隻雞和兔?」。雞兔同籠問題,是小學奧數的常見題型,也是計算機編程算法中常見的一道題,現階段開始shell腳本的學習,所以不妨用腳原本嘗試編寫一個計算該問題的腳本,加深本身對Linux shell腳本的理解。shell
算法編程
在作一道數學題以前,思路是極爲重要的,本身如何解決這道題,怎麼按照計算機語言的思惟來幫助咱們計算就成爲了首要之重。咱們明白,這是一道典型的二元一次方程,假設兔子爲x,雞爲y,獲得方程(1) x+y=35;(2) 4x+2y=94,(2)-2*(1)便可獲得2x=24,x=12的值,從而獲得y=23,可是咱們如何用腳本語言中表達出意思呢?ide
題目中給出的量是35個頭,94只腳,要求計算的是兔子和雞的數量,所以咱們能夠將兔子和雞看做是計算機要計算的數,頭和腳是須要手動輸入的數,不能說是題目給94,35,作出的腳本就只能按照94和35計算吧,那未免也太浪費資源了吧?學習
網上有不少的思路,不過咱們能夠看到,上述方程(2)除以2再減去方程(1)也就能夠獲得一隻小動物的數量了,全部咱們的思路是設定變量feet爲腳的數量,設定變量head爲頭的數量,所以就能夠有$feet/2-$head 就能夠出來一鍾小動物的數量,餘下的用$head的值去減,另一隻小動物數量也隨之而出了。spa
編程orm
在獲得上面的思路後,編程能夠開始了,第一步,讓某某人輸入頭的數量和腳的數量blog
read -p "input the sumheads:" head資源
read -p "input the sumfeet:" feetinput
#輸入一共有多少個頭,多少隻腳
好了,接下來咱們就能夠擺數字計算了嗎?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出來的擺算式了吧?那麼,好的
rabbits=$[$[$feet/2]-$head ]
chicken=$[$head-$rabbits]
############################
c=$[$chicken*2]
h=$[$rabbits*4]
tmp=$[$[$c+$h]/$feet]
若是說'#'之上的能看做根據以前思路列出的算式,那麼下面的是幹什麼的?答:本身想去吧
不難發現,'#'之下的$tmp做爲一個臨時變量,計算意思是計算出的腳的數量除以輸入的腳的數量,作這個是爲了發現輸入的數值是否符合正常運算,說到底仍是在看是否是失誤輸入,所有碼爲
rabbits=$[$[$feet/2]-$head ]
chicken=$[$head-$rabbits]
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狀況算是涼了,最後附上代碼和各類輸入的狀況