概述

鸡兔同笼,是古代著名典型趣题之一,记载于《孙子算经》之中,题目为“有若干只鸡兔同在一个笼子里,从上面数,有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

用计算机程序计算鸡兔同笼,Linux脚本基础篇-鸡兔同笼问题(示例代码)相关推荐

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

    概述 鸡兔同笼,是古代著名典型趣题之一,记载于<孙子算经>之中,题目为"有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚.问笼中各有多少只鸡和兔?" ...

  2. linux下计算目录文件和,统计Linux 中文件和文件夹/目录的数量(示例代码)

    嗨,伙计们,今天我们再次带来一系列可以多方面帮助到你的复杂的命令. 通过操作命令,可以帮助您计数当前目录中的文件和目录.递归计数,统计特定用户创建的文件列表等. 在本教程中,我们将向您展示如何使用多个 ...

  3. Linux 快速基础篇__Linux操作系统

    Linux 快速基础篇__Linux操作系统 Linux操作系统 文章目录 Linux 快速基础篇__Linux操作系统 Linux操作系统 学习目标 一.操作系统概述 1.计算机分类 2.计算机组成 ...

  4. LINUX学习基础篇(六)帮助命令

    LINUX学习基础篇(六)帮助命令 帮助命令 man(Manual) info help - -help 帮助命令 man(Manual) 作用:查看联机帮助手册. 执行权限:所有用户. man命令的 ...

  5. LINUX学习基础篇(十二)痕迹命令

    LINUX学习基础篇(十二)痕迹命令 系统痕迹命令 w命令 who命令 last命令 lastlog命令 lastb命令 系统痕迹命令 系统中有一些重要的痕迹日志文件,如/var/log/wtmp./ ...

  6. LINUX学习基础篇(十五)软件包管理

    LINUX学习基础篇(十五)软件包管理 软件包管理 软件包分类 源码包 二进制包 选择 依赖性 rpm包安装 rpm包命名规则 rpm包安装和卸载 服务命令 rpm查询命令 验证 数字证书 rpm中文 ...

  7. Linux内核基础篇——常用调试技巧汇总

    文章目录 printk 动态输出 BUG()和BUG_ON() dump_stack() devmem printk printk共有8个等级,从0-7,等级依次降低. 打印等级可以通过修改/proc ...

  8. LINUX学习基础篇(三十三)系统资源

    LINUX学习基础篇(三十三)系统资源 系统资源查看 vmstat命令监控系统资源 dmesg显示开机时内核检测信息 free命令查看内存使用状态 查看CPU信息 查看内存信息 查看当前登录的用户 u ...

  9. LINUX学习基础篇(三十五)日志管理

    LINUX学习基础篇(三十五)日志管理 日志管理 系统中常见的日志文件 日志文件格式 rsyslogd服务的配置文件 日志轮替 logrotate配置文件 配置文件夹 /etc/logrotate.d ...

  10. LINUX学习基础篇(二十二)硬盘结构

    LINUX学习基础篇(二十二)文件系统管理 硬盘 磁盘结构 硬盘接口 硬盘 磁盘结构 扇区是磁盘的最小存储单位,每个扇区的大小是固定的,为512Byte.硬盘里有多个磁盘,每个磁盘中,有多个同心圆,这 ...

最新文章

  1. HDU 4708 Rotation Lock Puzzle(模拟)
  2. 【校招面试 之 C/C++】第15题 C 回调函数
  3. Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权
  4. VTK:非结构化网格之ClipUnstructuredGridWithPlane
  5. 前端学习(891):bom导读
  6. dcm4chee汉化_docker dcm4chee
  7. 【转】使用chrome插件Page Monitor监控网页内容变化
  8. C#两种方法输出1~100间的质数(素数)
  9. 安卓开关Switch使用的小细节
  10. Adobe Acrobat Pro DC拆分PDF
  11. 内存测试软件 ddr4,DDR4内存测试软件
  12. Kettle Carte模式
  13. python制作购物秒杀脚本,以淘宝秒杀脚本为例!
  14. Python带你面向对象爬取网易云音乐
  15. 5 封装性和private关键字
  16. 导出https网站证书
  17. (JAVASwing界面)java实现简单的人事管理系统(数据库原理课程设计)
  18. Git提示nothing to commit, working tree clean
  19. Python 网络爬虫实战:爬取《去哪儿》网数千篇旅游攻略数据,再也不愁旅游去哪儿玩了
  20. gnu radio学习(二)Stream Tags流标签详解

热门文章

  1. Mac新手必备技巧之如何关闭Mac屏幕亮度自动调节功能
  2. gsoap linux中文乱码,gsoap中文乱码及内存清理等问题的解决方案
  3. Linux内核同步机制之(八):mutex
  4. AlertManager实现webhook告警(使用Postman测试)
  5. 视频压缩 I P B 帧 详解
  6. Distributed Database Containers Deployment and Orchestration
  7. Windows视频桌面壁纸实现(libvlc)(类似于wall paper engine效果)
  8. 牛皮凉席发霉如何处理?
  9. ThinkPHP5分页样式
  10. 分级基金及套利策略:申购套利、赎回套利、低折套利