兩個整數的最大公約數怎么實現的?

本文所選的例子來自于《advanced bash-scripting gudie》一書,譯者 楊春敏 黃毅

 1 #!/bin/bash 2  #求兩個整數的最大公約數 3   4  E_BADARGS=65 5   6  #如果參數個數不為2,以參數錯誤退出 7  if [ $# -ne 2 ] 8  then 9      echo "Usage: `basename $0` first-number second-number"10      exit $E_BADARGS11  fi12 13  #如果參數非整數或參數值為0,以參數錯誤退出14  for i in $@15  do16      if [ $i=~[0-9]+ ]                                         #"=~"后面表示要跟正則表達式,+在正則表達式中表示前面的內容至少匹配一次17      then18         if [ $i -eq 0 ]19         then20             echo "Usage: `basename $0` parameter can't be zero"21             exit $E_BADARGS22         fi23      else24             echo "Usage: `basename $0` parameter must be integer"25         exit $E_BADARGS26       fi27  done28 29  #設計一個gcd()函數,利用輾轉相除法(歐幾里德算法)求最大公約數30  gcd()31  {32      remainder=133      dividend=$134      divisor=$235  36      until [ $remainder -eq 0 ]37      do38          let "remainder=$dividend % $divisor"39          dividend=$divisor40          divisor=$remainder41      done42  }43  44  gcd $1 $245  46  echo "gcd of $1 and $2 is: $devidend"47  48  exit 0

在改編這個腳本的時候,我的考慮點主要有以下:

1. 所傳的參數是不是要排除非整數的情況?

非整數的情況第一次我用echo $i | sed ‘/s/^[0-9]*$/”/g’ && echo $?來排除,如果第一條命令正確執行,$?應該返回0,但是我們有更好的方法,即“=~”后面跟正則的方式

2. 參數值為0的情況是不是要排除在外?

在判斷$i為整數的判斷下再嵌套一個判斷[ $i -eq 0 ]

3. 參數個數怎么控制?

[ $# -eq 2 ]或[ $# -ne 2 ]就可以排除空參數或參數個數不為2

4. 歐幾里德算法中對于$1

先看$1>$2的情況

$1=65 $2=15

第一個循環:5=65 % 15

      dividend=15

      divisor=5

第二次循環 0=15%5

      dividend=5

      divisor=0

退出循環,gcd=$dividend=5

再看$1

$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的情況多了一個循環,結果是一樣的

? ??

?

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享