稍微改变bool素数函数

Slight change to bool prime function

本文关键字:函数 bool 改变      更新时间:2023-10-16

前一段时间我得到了一个关于如何编码bool函数来检查一个数字是否是素数的问题的答案:素数的bool函数。

从这里开始,有效的代码是

bool prime(int x)
{
if (x < 2) return false;
for(int i=2; i<= sqrt(x); i++) {
if ((x%i) == 0) return false;
}
return true;
}
但是如果我把代码改成
bool prime(int x)
{
if (x < 2) return false;
for(int i=2; i<= sqrt(x); i++) {
if ((x%i) != 0) return true;
}
return false;
}

对于许多整数,它不能正确地判断一个数是否是素数。我本以为这两段代码是等价的。有没有办法使这个bool prime函数与!=一起工作?

谢谢。

No。当测试一个数字是否是素数时,你知道它不是只要你找到一个因数。

这就是为什么您可以在第一个示例中提前跳出for循环并返回false的原因:

if ((x%i) == 0) return false;

发现任何单个数字不是因数并不能证明一个数字是素数或非素数,因此在该条件下不能提前终止。

不,不可能。

这段原始代码在发现因子时提前返回。修改后的版本在发现为因子时提前返回。因为你必须测试所有可能的因子(至少是小于平方根的因子)才能确定这个数不是素数,所以你提出的方法是行不通的。

另一方面,一个小小的改变可以使算法的效率提高近一倍。因为我们不需要测试任何大于2的偶数,所以我们可以先测试2,然后以3开始循环并递增2s:

bool prime(int x)
{
  if (x < 2) return false;
  if (x%2 == 0) return x == 2;
  for(int i=3; i<= sqrt(x); i+=2) {
    if ((x%i) == 0) return false;
  }
  return true;
}