这是我的 bash 脚本计算阶乘的代码
read -p "Please enter the number " number
while ([ $number -gt 0 ])
do
factorial=1
for ((i=$number;i > 0;i--))
do
factorial=$((factorial * $i))
done
echo "The factorial of the " $number " is " $factorial
number=$((number - 1))
done
这会打印出从 {input:1} 开始的所有数字的阶乘,除了少数几个的阶乘之外,一切看起来都是正确的。输出如下所示。
正如您所看到的,某些数字的阶乘是负值。我从在线论坛了解到,bash 脚本在计算较大数字的阶乘时通常会中断,但就我在网上挖掘的内容而言,这些负值似乎并不常见。如果有人能解释一下其中的原因,那对我的学习会有很大帮助。谢谢你!
答案1
bash 算术是通过有符号的 64 位整数完成的,因此最大数量是:
$ max=$(( (1<<63) - 1 )); echo "$max"
9 223 372 036 854 775 807
如果你超过它,你会从相反的范围开始,即负数。
$ echo $(( $max + 1 ))
-9 223 372 036 854 775 808
这与 C 语言中处理整数溢出的方式完全相同。
对于阶乘,20!
仍然低于它,但不是21!