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

问题描述 投票:1回答:1

这是我的脚本:

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

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

bash macos shell
1个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.