shell编程最小公约数和最大公倍数 1)Linux shell脚本编程实现 2)用户通过脚本参数传递两个整数

如题所述

转的,改正了错误,测试通过:

#!/bin/bash
#=================================================================
#    Author :  wang_qs                                         
#    Info   :  求两个数的最大公约数和最小公倍数                                                                 
#    Input  :  LCM表示最小公倍数(lowest common multiple) 
#    Call   :  lcm 12 15            
#    Date   :  2010/12/17 - modify format           
#    xxxx   :  2010/12/17 - Creation                              
#-----------------------------------------------------------------
#  Usage information                                              
#-----------------------------------------------------------------
Usage()
{
 echo "========================================="
 echo "求两个数的最大公约数和最小公倍数"
 echo "用法: lcm 12 15"
 echo "返回: 最大公约数:3,最小公倍数:60."
 echo "========================================="
 exit -1
}
#-----------------------------------------------------------------
#  Test for valid input or display usage() information            
#-----------------------------------------------------------------
if [ $# -lt 2 ]; then
  Usage
fi
#-----------------------------------------------------------------
#   得到命令中的两个值
#-----------------------------------------------------------------
num1=$1
num2=$2
#-----------------------------------------------------------------
#   operation the variables
#   1.先找出其中一个比较小的数,用这个数进行递增的循环
#   2.对另外一个值进行求膜运算
#   3.在运算过程中,对能整除的循环变量记录下来
#   4.把能整除的最大的变量opr取出(最大公约数)
#   5.result = num1/opr  *  num2/opr  * opr = num1/opr * num2
#-----------------------------------------------------------------
#-----------------------------------------------------------------
#   get num : 1.GREAT,2.SMALL
#-----------------------------------------------------------------
if [ $num1 -eq $num2 ]; 
then
    echo "最大公约数:${num1},最小公倍数:${num1}."    
    exit
fi
if [ $num1 -gt $num2 ]; 
then 
    GREAT=$num1
    SMALL=$num2
    export GREAT
    export SMALL
else
    GREAT=$num2
    SMALL=$num1
    export GREAT
    export SMALL
fi 
#echo "GREAT ${GREAT}"
#echo "SMALL ${SMALL}"
#-----------------------------------------------------------------
#   程序测试最大公约数,初始化变量
#   tmp=`expr $GREAT % $i` 语法调试了半个小时!!
#-----------------------------------------------------------------
i=1
GCD_RESULT=1
greattmp=1
smalltmp=1
LCM_RESULT=1
export  i
export  greattmp
export  smalltmp
export  GCD_RESULT
export  LCM_RESULT
while [ $i -le $SMALL ]
do
#echo "LOOP i: ${i}"
    greattmp=`expr $GREAT % $i`
    smalltmp=`expr $SMALL % $i`
#echo "greattmp : ${greattmp}"
#echo "smalltmp : ${smalltmp}"
    if [ ${greattmp} -eq 0 ]; then 
        if [ ${smalltmp} -eq 0 ]; then
            GCD_RESULT=${i}
        fi
    fi
    i=`expr ${i} + 1`
#echo "GCD_RESULT : ${GCD_RESULT}"
done
#echo ${GCD_RESULT}
#-----------------------------------------------------------------
#   上面已经求出了最大的公约数(GCD_RESULT)
#   下面进行最小公倍数的处理
#   为了避免变量名的太多,这里的余数用smalltmp和greattmp代替
#   5.result = num1/opr  *  num2/opr  * opr = num1/opr * num2
#   *号为乘号,要考虑转义
#-----------------------------------------------------------------
LCM_RESULT=`expr $SMALL / $GCD_RESULT`
#echo "LCM_RESULT : ${LCM_RESULT}"
LCM_RESULT=`expr $LCM_RESULT \* $GREAT`
echo "最大公约数:${GCD_RESULT},最小公倍数:${LCM_RESULT}."
#-----------------------------------------------------------------
#EOF
#-----------------------------------------------------------------

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-11
#!/bin/bash

if [ $# -ne 2 ];then
    echo "USAGE:$0 integer1 integer2"
    exit
fi
gcd=
lcm=
GCD()
{
    a=$1
    b=$2
    if [ $a -lt $b ];then
        max=$b
        min=$a
    else
        max=$a
        min=$b
    fi
    if [ $(($max%$min)) -ne 0 ];then
        GCD $min $(($max%$min))
    fi
    gcd=$min
}

LCM()
{
    GCD $1 $2
    b=$(($1*$2))
    lcm=$(($b/$gcd))
}
GCD $1 $2
LCM $1 $2

echo "gcd of $1 and $2 is $gcd, lcm is $lcm"

相似回答