什么是var prime = num!= 1;意思?

时间:2012-12-14 21:26:20

标签: javascript

我知道这与another SO question类似,但变量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 个答案:

答案 0 :(得分: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; 
}

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

答案 1 :(得分:2)

正如您所想的那样,语句var prime = num != 1;将布尔表达式(num != 1)的结果赋给变量prime。这种特殊情况包含在每个主要检查代码中,因为1本身不是素数。

如果只检查输入值的平方根除数,那么算法可能会更快。您可以阅读有关此here的信息,并且可能会注意到检查num > i*i是否比sqrt(num) > i更有效。

此外,如果您将其提供给负值或零值,您所拥有的算法仍可能返回错误的值。

答案 2 :(得分:1)

1 is not a prime number

这是一个边缘案例检查,因为for(i = 2;..)(下面)“跳过”1:因为循环永远不会运行,prime只设置一次false(这是评估当i != 1)时i = 1。{/ p>

然而,我发现它令人困惑,并会使用:

if (i <= 1) {
  return false;
} else {
  // other stuff
}

答案 3 :(得分:1)

该代码行的目的是在一个目标中实现两个目标:

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

他们只是同时做两件事。