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

概述算法


鸡兔同笼,是古代著名典型趣题之一,记载于《孙子算经》之中,题目为“有若干只鸡兔同在一个笼子里,从上面数,有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状况算是凉了,最后附上代码和各类输入的状况

image.png

image.png

相关文章
相关标签/搜索