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
分享到:
评论