本文所选的例子来自于《Advanced Bash-scripting Gudie》一书,译者 杨春敏 黄毅

 #!/bin/bash
  #求两个整数的最大公约数

  E_BADARGS=

  #如果参数个数不为2,以参数错误退出
   ]
  then
      echo "Usage: `basename $0` first-number second-number"
      exit $E_BADARGS
  fi

  #如果参数非整数或参数值为0,以参数错误退出
  for i in $@
  do
      -]+ ]                                         #"=~"后面表示要跟正则表达式,+在正则表达式中表示前面的内容至少匹配一次
      then
          ]
         then
             echo "Usage: `basename $0` parameter can't be zero"
             exit $E_BADARGS
         fi
      else
             echo "Usage: `basename $0` parameter must be integer"
         exit $E_BADARGS
       fi
  done

  #设计一个gcd()函数,利用辗转相除法(欧几里德算法)求最大公约数
  gcd()
  {
      remainder=
      dividend=$
      divisor=$

       ]
      do
          let "remainder=$dividend % $divisor"
          dividend=$divisor
          divisor=$remainder
      done
  }

  gcd $ $

  echo "gcd of $1 and $2 is: $devidend"

  exit 

在改编这个脚本的时候,我的考虑点主要有以下:

1. 所传的参数是不是要排除非整数的情况?

非整数的情况第一次我用echo $i | sed '/s/^[0-9]*$/''/g' && echo $?来排除,如果第一条命令正确执行,$?应该返回0,但是我们有更好的方法,即“=~"后面跟正则的方式

2. 参数值为0的情况是不是要排除在外?

在判断$i为整数的判断下再嵌套一个判断[ $i -eq 0 ]

3. 参数个数怎么控制?

[ $# -eq 2 ]或[ $# -ne 2 ]就可以排除空参数或参数个数不为2

4. 欧几里德算法中对于$1<$2的情况的处理?

先看$1>$2的情况

$1=65 $2=15

第一个循环:5=65 % 15

      dividend=15

      divisor=5

第二次循环 0=15%5

      dividend=5

      divisor=0

退出循环,gcd=$dividend=5

再看$1<$2的情况

$1=15 $2=65

第一次循环:15=15 % 65

      dividend=65

      divisor=15

第二次循环:5=65 % 15

      dividend=15

      divisor=5

第三次循环:0=15 % 5

      dividend=5

      divisor=0

退出循环,gcd=$dividend=5

可知$1<$2的情况比$1>$2的情况多了一个循环,结果是一样的

《Advanced Bash-scripting Guide》学习(十九):两个整数的最大公约数的更多相关文章

  1. c 求两个整数的最大公约数和最小公倍数

    //求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ...

  2. 求两个整数的最大公约数GCM

    思路分析: (1)求差判定法:  如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数 ...

  3. php取两个整数的最大公约数算法大全

    php计算两个整数的最大公约数常用算法 <?php//计时,返回秒function microtime_float (){ list( $usec , $sec ) = explode ( &q ...

  4. 强化学习(十九) AlphaGo Zero强化学习原理

    在强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)中,我们讨论了MCTS的原理和在棋类中的基本应用.这里我们在前一节MCTS的基础上,讨论下DeepMind的AlphaGo Zero强化学 ...

  5. 【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数

    程序分析: 在数学中,两个数的最小公倍数=两个数的乘积/两数的最大公约数. 求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N. 如果余数为0,则N即为所求:如果余 ...

  6. Scala学习十九——解析

    一.本章要点 文法定义中的二选一.拼接.选项和重复在Scala组合子解析器中对应|.~.opt和rep 对于RegexParsers而言,字符串字面量和正则表达式匹配的是词法单元 用^^来处理解析结果 ...

  7. Spring学习(十九)----- Spring的五种事务配置详解

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

  8. Python3.5 学习十九 Django分模块讲解 MTV+URL

    本节内容概述: 表单提交的Method使用规则:get 获取数据 post提交数据 单选使用get 多选使用getlist request.POST.getlist("favor" ...

  9. Spring学习(十九)----- Spring与WEB容器整合

    首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> ...

随机推荐

  1. mysql练手

    1.根据图创建下列表格 没有外键的表先创建,创建顺序为teacher,class,course,student CREATE TABLE class ( cid INT NOT NULL auto_i ...

  2. JS基础知识简介

    使用js的三种方式 1.HTML标签内嵌js <button onclick="javascript:alert(真点啊)">有本事点我</button> ...

  3. [转】[tip] localhost vs. (local) in SQL Server connection strings

    主要区别在于连接协议不同,前者(localhost)使用TCP协议,后者("(local)")使用NamedPipe协议. Sample code with SQL Server ...

  4. 007-sql整体概述

    一.概述 sql基础:数据库.数据表.行.列.关系 查询: Select 字段1,字段2,* from 表 where 条件 去除重复:Distinct 必须放在所有列前面 区间语句:BETWEEN ...

  5. LeetCode-11-6

    1.  Two Sum Given an array of integers, return indices of the two numbers such that they add up to a ...

  6. 剑指offer 面试39题

    面试39题: 题目:数组中出现次数超过一半的数字 题:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中 ...

  7. java考试

    package ATM;import java.util.Scanner; /**  * 操作学生数据  *   * @author Administrator  *  */  public clas ...

  8. Python基础之socket编程(Day29)

    一.客户端/服务器架构 1.硬件c/s架构(打印机) 2.软件c/s架构 互联网中处处是c/s架构 浏览的网页就是如此 C/S架构与socket的关系 socket就是为了完成c/s架构的开发 二.s ...

  9. 缓存:Memcached Redis

    一.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...

  10. 美图秀秀 web开发图片编辑器

    美图秀秀web开发平台 http://open.web.meitu.com/wiki/ 1.环境配置 1.1.设置crossdomain.xml 下载crossdomain.xml文件,把解压出来的c ...