2

我知道这类似于另一个 SO 问题,但该变量prime应该是除 之外的任何数字1,而且在我看来,它会被赋予布尔值num != 1。谁能告诉我这行代码实际上在做什么?

这是使用它的代码

function isPrime( num ) { 
  var prime = num != 1; // Everything but 1 can be prime 
  for ( var i = 2; i < num; i++ ) { 
    if ( num % i == 0 ) { 
      prime = false; 
      break; 
    } 
  } 
  return prime; 
} 

编辑: 我假设这条线做了这样的事情:

if( num != 1) {
    prime = num;
}

但我仍然想知道这行代码为什么如何做到这一点。

4

4 回答 4

2

换句话说:

如果 num == 1,将prime设置为 false 并跳过循环。

否则,进入循环并使用标准逻辑来确定prime的值。

这样做是因为标准逻辑(循环内部)不适用于数字 1。

因此,正如 pst 所说,您检查循环外的边缘情况。

这有助于保持循环内部的逻辑干净。


为了使其更具可读性(并且对所有值都正确),我会像这样重写它:

function isPrime( num ) { 

    if (num <= 1) {
        return false;
    }

    for ( var i = 2; i < num; i++ ) { 
        if ( num % i == 0 ) { 
            return false; 
        } 
    } 

    return true; 
}

一旦 i 大于,您也可以退出循环num / 2以提高效率。

于 2012-12-14T21:28:36.160 回答
2

正如您正确思考的那样,该语句var prime = num != 1;将布尔表达式的结果分配给(num != 1)变量prime。这种特殊情况包含在每种质数检查代码中,因为1它本身不是质数。

如果您只检查不超过输入值平方根的除数,您的算法可能会更快。您可以在此处阅读相关内容,并且可能会注意到检查 ifnum > i*isqrt(num) > i.

此外,如果您输入负值或零值,您拥有的算法仍可能返回错误值。

于 2012-12-14T21:32:01.970 回答
1

1 不是质数

这是一个边缘情况检查,因为for(i = 2;..)(下面)“跳过” 1: 因为循环从不运行,prime只设置一次false(这是对i != 1, when的评估i = 1)。

但是,我发现它令人困惑并且会使用:

if (i <= 1) {
  return false;
} else {
  // other stuff
}
于 2012-12-14T21:27:40.480 回答
1

那行代码的重点是合二为一:

  • 首先,他们需要创建一个布尔变量
  • 其次,他们需要检查数字是否为 1,那么它不是素数

他们只是同时做这两件事。

于 2012-12-14T21:34:36.673 回答