本文所选的例子来自于《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. 正确使用索引(sql优化),limit分页优化,执行计划,慢日志查询

    查看表相关命令 - 查看表结构   desc 表名- 查看生成表的SQL   show create table 表名- 查看索引   show index from  表名 使用索引和不使用索引 由 ...

  2. 用户(user)和用户组(group)相关的配置文件、命令或目录;

    1.与用户(user)和用户组(group)相关的配置文件: 1)与用户(user)相关的配置文件:/etc/passwd 注:用户(user)的配置文件:/etc/shadow 注:用户(user) ...

  3. Zookeeper配置说明

    转载自:https://my.oschina.net/u/2338362/blog/399361 Zookeeper的安装和配置十分简单, 既可以配置成单机模式, 也可以配置成集群模式. 下面将分别进 ...

  4. ZFIR_001 ole下载

    *&---------------------------------------------------------------------** Report ZFIR_001* Appli ...

  5. ORA-00001:unique constraint violated 以及 Incorrect result size: expected 1, actual 0

    往数据库中插入数据时报错:   www.2cto.com   ORA-00001: unique constraint (IDX_CARTON_HEADER)violated.   即往CARTON_ ...

  6. 希望and目标

    软件工程是一门枯燥的课程,这门课我不喜欢上,容易犯困,但就因为如此.我不得不好好的学习,我希望在这门课上.我能将基础学扎实,在实践上可以自己慢慢研究,我的目标不是很远大,学好.学扎实..在这门课上一周 ...

  7. 混淆Android JAR包的方法

    http://blog.csdn.net/vurtne_ye/article/details/35599491 1)导出jar包 如何在eclipse上Android工程中导出jar包?google, ...

  8. linux ip别名和辅助ip地址

    转:https://blog.csdn.net/xiewen99/article/details/54729112?utm_source=itdadao&utm_medium=referral ...

  9. yield 表达式形式的应用

    import random foods=['banana','apple','peach','grape','pear'] def deco(func): def wrapper(*args,**kw ...

  10. 黑色CSS3立体动画菜单

    在线演示 本地下载