某些数字的因子产生负值

Amm*_*mmu 0 linux bash shell-script

这是我的 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
Run Code Online (Sandbox Code Playgroud)

这将打印出从 {input:1} 范围内的所有数字的阶乘,除了少数的阶乘之外,一切看起来都正确。输出如下。 计算阶乘的代码输出

如您所见,某些数字的阶乘是负值。我从在线论坛了解到 bash 脚本在计算较大数字的阶乘时通常会中断,但就我可以在线挖掘而言,这些负值似乎并不常见。如果有人可以解释其原因,它将对我的学习有很大帮助。谢谢!

Pat*_*zek 7

bash 算法是在有符号的 64 位整数上完成的,所以最大数字是:

$ max=$(( (1<<63) - 1 )); echo "$max"
9 223 372 036 854 775 807
Run Code Online (Sandbox Code Playgroud)

如果你检查它,你会从相反的范围开始,即负数。

$ echo $(( $max + 1 ))
-9 223 372 036 854 775 808
Run Code Online (Sandbox Code Playgroud)

这与在 C 语言中管理整数溢出完全一样。

对于阶乘,20!仍然低于它,但不是21!