如果数字是JavaScript中的素数,则获取布尔值

时间:2017-11-24 22:46:20

标签: javascript function if-statement

我正在尝试解决这个问题,我需要在控制台上根据数字打印true或false(如果数字为Prime则为true,否则为false)。我似乎有解决方案,但我知道某处有错误,因为如果我更改2个isPrime变量的布尔值,我会得到不同的答案。

以下是问题: 如果num为prime,则返回true,否则返回false。

提示:素数只能​​被自身整除1 提示2:你可以使用for循环来解决这个问题。

注意:0和1不被视为素数

输入示例:

1 7 11 15 20

输出示例:

假 真正 真正 假 假

我的代码:

function isPrime(num){
  let isPrime = '';
  for(let i = 2; i <= Math.sqrt(num); i++){
    if(num % i === 0){
      isPrime = false;
    } else {
      isPrime = true;
    }
  }
  return isPrime;

}

isPrime(11);

2 个答案:

答案 0 :(得分:2)

你非常接近。我将建立在您的解决方案之上。一旦检测到该数字不是素数,您就需要返回 false 。这避免了我们进行额外的冗余计算。

你也没有考虑到第一个提示。

  

提示 - 注意:0和1不被视为素数

为此,如果数字为0或1,您只需return false

function isPrime(num) {
  if (num === 0 || num === 1) return false;
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (num % i === 0) return false;          
  }
  return  true;
}

同样在您的代码中,您使用变量 isPrime 来跟踪布尔值,同时使用空字符串初始化它。这是不正确的。 Javascript允许这样做,因为它的类型很弱,但这是误导性的。因此,将来如果为布尔值定义变量,请不要用字符串初始化它;)

进一步解决您的意见。如果您确实希望坚持在代码中使用标记,那么您可以使用 true 而不是空字符串初始化 isPrime

这样你就可以摆脱for循环中的 else 部分,从而缩短代码。我使用 @Commercial Suicide 提供的代码(顺便说一下,他确实说有更多优雅的解决方案)作为例子:

&#13;
&#13;
function isPrime(num) {
  let flag = true;
  let isPrime = true;
  if (num === 0 || num === 1) return false;
  if (num === 2) return true;
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (flag) {
      if(num % i === 0) {
        isPrime = false;
        flag = false;
      }
    }
  }
  return isPrime;
}

const numbers = [1, 7, 11, 15, 20];
const booleans = [false, true, true, false, false];

numbers.forEach((item, i) => {
  if (isPrime(item) === booleans[i]) {
    console.log("CORRECT");
  } else {
    console.log("WRONG");
  }
})
&#13;
&#13;
&#13;

然后您可以更进一步,删除标记变量。

function isPrime(num) {
  let isPrime = true;
  if (num === 0 || num === 1) return false;
  if (num === 2) return true;
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (isPrime) {
      if(num % i === 0) {
        isPrime = false;
      } else {
        isPrime = true;
      }
    }
  }
  return isPrime;
}

但是现在应该更清楚的是,这些标志实际上是多余的,正如我最初指出的那样。一旦检测到数字不是素数,只需返回false,以避免进一步不必要的循环运行。根据我多年来在javascript方面的经验,我可以看到我们正朝着功能性编程思维方向发展。它通常有助于避免变异突变。

答案 1 :(得分:2)

这是因为你的isPrime变量可以多次覆盖,简单的标志(例如)会阻止这个问题。我还添加了0,1和2的检查。有更优雅的方法可以做到这一点,但我想保留你的逻辑,这里有一些测试的例子:

&#13;
&#13;
function isPrime(num) {
  let flag = true;
  let isPrime = '';
  if (num === 0 || num === 1) return false;
  if (num === 2) return true;
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (flag) {
      if(num % i === 0) {
        isPrime = false;
        flag = false;
      } else {
        isPrime = true;
      }
    }
  }
  return isPrime;
}

const numbers = [1, 7, 11, 15, 20];
const booleans = [false, true, true, false, false];

numbers.forEach((item, i) => {
  if (isPrime(item) === booleans[i]) {
    console.log("CORRECT");
  } else {
    console.log("WRONG");
  }
})
&#13;
&#13;
&#13;