日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux环境下Shell脚本基础篇-鸡兔同笼问题

發(fā)布時(shí)間:2023/12/9 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux环境下Shell脚本基础篇-鸡兔同笼问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述


雞兔同籠,是古代著名典型趣題之一,記載于《孫子算經(jīng)》之中,題目為“有若干只雞兔同在一個(gè)籠子里,從上面數(shù),有35個(gè)頭,從下面數(shù),有94只腳。問籠中各有多少只雞和兔?”。雞兔同籠問題,是小學(xué)奧數(shù)的常見題型,也是計(jì)算機(jī)編程算法中常見的一道題,現(xiàn)階段開始shell腳本的學(xué)習(xí),因此不妨用腳本來嘗試編寫一個(gè)計(jì)算該問題的腳本,加深自己對(duì)Linux shell腳本的理解。

?

算法

? ? ? ?

在做一道數(shù)學(xué)題之前,思路是極為重要的,自己如何解決這道題,怎么按照計(jì)算機(jī)語言的思維來幫助我們計(jì)算就成為了首要之重。我們明白,這是一道典型的二元一次方程,假設(shè)兔子為x,雞為y,得到方程(1) x+y=35;(2) 4x+2y=94,(2)-2*(1)即可得到2x=24,x=12的值,從而得到y(tǒng)=23,但是我們?nèi)绾斡媚_本語言中表達(dá)出意思呢?

?

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

?

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

?

編程


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

read -p "input the sumheads:" head

read -p "input the sumfeet:" feet

#輸入一共有多少個(gè)頭,多少只腳


好了,接下來我們就可以擺數(shù)字計(jì)算了嗎?No!計(jì)算機(jī)思維沒有像我們?nèi)祟愃季S天生帶限制范圍,稍微一不注意就報(bào)錯(cuò),所有第一步還是檢查輸入的是不是數(shù)字吧!

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

#檢查輸入的任意一個(gè)值是否為數(shù)字,不是的話報(bào)錯(cuò)誤格式并退出,退出是整個(gè)腳本退出,不是當(dāng)前命令退出繼續(xù)執(zhí)行,因此使用花括號(hào)括起來


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

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

#檢查輸入頭的數(shù)量是否大于腳的數(shù)量,如果大于,報(bào)錯(cuò)誤的數(shù)值


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

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

chicken=$[$head-$rabbits]

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

c=$[$chicken*2]

h=$[$rabbits*4]

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

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


不難發(fā)現(xiàn),'#'之下的$tmp作為一個(gè)臨時(shí)變量,計(jì)算意思是計(jì)算出的腳的數(shù)量除以輸入的腳的數(shù)量,做這個(gè)是為了發(fā)現(xiàn)輸入的數(shù)值是否符合正常運(yùn)算,說到底還是在看是不是失誤輸入,全部碼為

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說明給出頭和腳的數(shù)量是搭配的,否則給出提示語,計(jì)算的值也可能不是所要的答案


輸出結(jié)果表示上

echo chicken=? $chicken?

echo rabbits=? $rabbits


ok,可以算出來了,shell腳本不支持小數(shù)點(diǎn),本來還想分別對(duì)$tmp>1和$tmp<1的情況做出不同解釋不同運(yùn)算,或許目前我的水平還不知道是否可以存在0<$tmp<1的情況,這下對(duì)于我而言$tmp<1情況算是涼了,最后附上代碼和各種輸入的情況

轉(zhuǎn)載于:https://blog.51cto.com/13873498/2154682

總結(jié)

以上是生活随笔為你收集整理的Linux环境下Shell脚本基础篇-鸡兔同笼问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。