轻微改变bool prime函数

时间:2012-12-26 12:09:24

标签: c++

不久前,我得到了一个关于如何编码bool函数以检查数字是否为素数的问题的答案:bool function for prime numbers

因此,有效的代码是

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函数与!=一起使用?

感谢。

2 个答案:

答案 0 :(得分:2)

没有。当测试一个数字是否为素数时,您知道它不是一旦找到单个因子就会出现。

这就是为什么你可以提前摆脱for循环并在第一个例子中返回false:

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

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

答案 1 :(得分:1)

不,这是不可能的。

如果找到一个因素,这个原始代码会提前返回。修改后的版本在找到因子的那一刻就返回。由于您必须先测试所有可能的因子(至少是那些小于平方根的因子),然后才能确定该数字不是素数,否则您建议的方法无法工作。

另一方面,一个小的变化几乎可以使算法的效率翻倍。由于我们不必测试任何大于2的偶数,我们可以先测试2,然后用3开始循环并增加2:

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;
}
相关问题