我的bash脚本检查素数工作不正确?

时间:2016-12-15 11:19:52

标签: bash macos shell

这是我的剧本:

#!/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!

似乎证明的数字不会以正确的方式解释。 任何线索?

1 个答案:

答案 0 :(得分:2)

原因是由于系统可以支持的最大正整数引起的整数溢出。由于这个原因,(2^31)-1(2^63)-1上的32-bit64-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

您当然可以根据系统架构检查脚本的功能,直到最大允许的整数值。