この特別なwhileループは数字20までしか機能しないことを認めます。それ以来、間違った答えが提供され始めましたが、その理由を理解していません。
#!/bin/bash
n=$1
[ "$n" == "" ] && echo Please give a number and try again && exit
factorial=1 ; j=1
while [ $j -le $n ]
do
factorial=$(( $factorial * $j ))
j=$(( $j + 1 ))
done
echo The factorial of $n, "$n"'!' = $factorial
exit 0
21を引数として指定すると、-4249290049419214848が得られます。バッシュ問題でしょうか?以下で階乗計算を試しましたが、同じ誤った答えを得ました。答えは次のとおりです。51090942171709440000
echo $(( 2432902008176640000 * 21 ))
ベストアンサー1
Bashは、ほとんどのシステムで符号付き64ビット整数を使用します。bc
この問題を解決するには、別の同様のツールが必要です。
これは、bashを使用して持つことができる最大数がこの数を超えることを意味し2^63-1
ます9,223,372,036,854,775,807
。
awk 'BEGIN{print 2432902008176640000 * 21}'
51090942171709440000 #--> 51,090,942,171,709,440,000