Linux环境下Shell脚本基础篇-鸡兔同笼问题
概述
雞兔同籠,是古代著名典型趣題之一,記載于《孫子算經》之中,題目為“有若干只雞兔同在一個籠子里,從上面數,有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出來的擺算式了吧?那么,好的
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情況算是涼了,最后附上代碼和各種輸入的情況
轉載于:https://blog.51cto.com/13873498/2154682
總結
以上是生活随笔為你收集整理的Linux环境下Shell脚本基础篇-鸡兔同笼问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 合肥工业大学计算机学院王院长,王青山(合
- 下一篇: Python教学视频(二)输出语句的使用