这是我的剧本:
#!/usr/bin/env bash
#for checking whether given number is prime or not
#typeset -i NUMBER
NUMBER=$1
if (( $NUMBER <= 1 ));then
echo "A prime number must be greater than 1!"
exit 0
fi
if (( $NUMBER == 2 || $NUMBER == 3 ));then
echo "$NUMBER is a PRIME number."
exit 0
fi
check=$(((($NUMBER**2)+17)%12))
if (( $check == 6 ));then
echo "$NUMBER is a PRIME number."
else
echo "$NUMBER is not a PRIME number."
fi
exit 0
一般情况下它有效但看看这个:
./prime2 12345765498743607656323978968565589876654541139797868554123589679789867896789789789789789789897789
A prime number must be greater than 1!
似乎证明的数字不会以正确的方式解释。 任何线索?
答案 0 :(得分:2)
原因是由于系统可以支持的最大正整数引起的整数溢出。由于这个原因,(2^31)-1
和(2^63)-1
上的32-bit
或64-bit
以外的数字开始具有负值。
检查我的Mac上的行为,64-bit
计算机
dudeOnMac: ~$ uname -a
Darwin dudeOnMac 14.5.0 Darwin Kernel Version 14.5.0: Sun Sep 25 22:07:15 PDT 2016; root:xnu-2782.50.9~1/RELEASE_X86_64 x86_64
dudeOnMac: ~$ ((number=(2**63)-1)); echo $number
9223372036854775807
dudeOnMac: ~$ ((number++)); echo $number
-9223372036854775808
以及您在输入中提供的奇怪数字
dudeOnMac: ~$ number=12345765498743607656323978968565589876654541139797868554123589679789867896789789789789789789897789
看看当我尝试增加它时会发生什么,
dudeOnMac: ~$ ((number++)); echo $number
-398770938935753666
因此,脚本中的条件if (( $NUMBER <= 1 ))
显然会在您的脚本中为true
。
您当然可以根据系统架构检查脚本的功能,直到最大允许的整数值。