`
bliuqing
  • 浏览: 67266 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

shell求最大公约数

阅读更多
  1 #!/bin/bash
   2 # gcd.sh: 最大公约数
   3 #         用Euclid运算法则
   4
   5 #  两个整数的"最大公约数"
   6 #+ 是能被这两个整数整除的大最整数.
   7
   8 #  Euclid运算法则采用逐次除法.
   9 #  每一次都重新赋值,
  10 #+ 被除数 <---  除数
  11 #+ 除数  <---  余数
  12 #+ 直到 余数 = 0.
  13 #+ 最后被传递的值中:最大公约数 = 被除数.
  14 #
  15 #  关于Euclid运算法则的讨论有一个出色的讨论,
  16 #  访问Jim Loy的网站, http://www.jimloy.com/number/euclids.htm.
  17
  18
  19 # ------------------------------------------------------
  20 # 参数检查
  21 ARGS=2
  22 E_BADARGS=65
  23
  24 if [ $# -ne "$ARGS" ]
  25 then
  26   echo "Usage: `basename $0` first-number second-number"
  27   exit $E_BADARGS
  28 fi
  29 # ------------------------------------------------------
  30
  31
  32 gcd ()
  33 {
  34
  35   dividend=$1                    #  随意赋值.
  36   divisor=$2                     #+ 这里在两个参数赋大的还是小的都没有关系.
  37                                  #  为什么?
  38
  39   remainder=1                    #  如果在循环中使用未初始化的变量,
  40                                  #+ 在循环中第一个传递值会使它返回一个错误信息
  41                                  #
  42
  43   until [ "$remainder" -eq 0 ]
  44   do
  45     let "remainder = $dividend % $divisor"
  46     dividend=$divisor            # 现在用最小的两个数字来重复.
  47     divisor=$remainder
  48   done                           # Euclid运算法则
  49
  50 }                                # 最后的$dividend变量值就是最大公约数.
  51
  52
  53 gcd $1 $2
  54
  55 echo; echo "GCD of $1 and $2 = $dividend"; echo
  56
  57
  58 # 练习:
  59 # --------
  60 #  检测命令行参数以确保它们是整数,
  61 #+ 如果不是整数则给出一个适当的错误信息并退出脚本.
  62
  63 exit 0
分享到:
评论
Global site tag (gtag.js) - Google Analytics