## 版本1,普通的实现,没有调用任何第三方程序
## --------------------------------------------

#!/bin/bash

echo To calculate n!
echo -n n=
read nn

rad=10000
len=1
buffs[1]=1
for (( i=1; i <= nn; i++ )); do
    let cc=0
    for ((j=1; j<=len; j++)) ; do
        let tt=buffs[j]*i+cc
        let buffs[j]=tt%rad
        let cc=tt/rad
    done       
       
    if  [ $cc -gt 0 ] ; then
        let len=len+1
        let buffs[len]=cc
    fi
done

echo -n ${nn}!=${buffs[$len]}
for ((i=len-1; i>=1; i--)) ; do
    echo -n `printf "%04d" ${buffs[$i]}`
done
echo





##  版本2,Linux bash的另一个实现
##  调用 bc来计算大数乘法,代码更简洁。
##  程序结构由2重循环变为单层循环,但是在每次循环中需要调用bc,tr命令,速度反而更慢些,代码见下:
##  当整数长度超过70个字符,bc的输出为多行格式,每行以\结尾,命令“tr -d ["\134\n\040"]”用来除去"\换行"和带来1个空格。

## --------------------------------------------------
#!/bin/bash
echo "calculate n!"
echo -n "n=?"
read n

r=1
for ((i=2; i <= n;i++)) ; do
  r=`echo $r*$i | bc`
  r=`echo $r | tr -d ["\134\n\040"]`
done

echo "$n!=$r"

Logo

更多推荐