checkPrime函数返回不正确的值

时间:2018-05-22 14:50:39

标签: javascript

numbers = [];
for (x = 1; x <= 1e4; x++) {
  numbers.push(x)
}
//console.log(numbers)

function checkPrime(num) {
  if (num == 1 || num == 0) {
    return 'It is a separate case'
  }
  if (num == 2) {
    return num + ' is prime'
  }
  for (var i = 2; i < num; i++) {
    if (num in numbers) {
      if (num % i === 0) return num + ' is not prime';
      else {
        return num + ' is prime';
      }
      return num !== 1;
    } else {
      return num + ' is not in range';
    }
  }

}
console.log(checkPrime(27));

您好。 在上面的代码中,我尝试创建一个函数,该函数返回有关数字是否为素数的信息。

然而,在某些情况下失败了。比如说。在27或145的情况下,它返回的值是素数,这显然是假的。如何修改此程序以使其正常工作?

此外,合并2号和其余素数的最明智的方法是什么?

提前致谢,如果这太基础,我很抱歉,我无法在其他任何地方找到正确答案。

3 个答案:

答案 0 :(得分:1)

你正在使用其他&#39;在完成检查所有数字直到自身-1之前,声明该数字为素数的子句。

为了达到最佳效果,您不需要循环直到数字(&lt; num)。直到数字的平方根。 (甚至比循环直到num / 2更好)例如:当环已达到13时,可以看到167是素数.13 * 13 = 169&gt; 167所以你可以停下来并安全地确认167是素数。

对于2号,有一个sepparate案例是正确的。

下面是检查单个值是否为素数的代码:

&#13;
&#13;
function checkPrime(num) {
  if (num == 1 || num === 0) {
    return 'It is a separate case'
  }
  if (num == 2) {
    return num + ' is prime'
  }
  for (var i = 2; i < Math.sqrt(num); i++) {
      if (num % i === 0) return num + ' is not prime';
  }
  return num + ' is prime';
}
alert(checkPrime(27));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我已经重写了代码以提供正确的答案

numbers = [];
for (x = 1; x <= 1e4; x++) {
  numbers.push(x)
}
//console.log(numbers)

function checkPrime(num) {
  if (num == 1 || num == 0) {
    return 'It is a separate case'
  }
  // check this condition outside the loop
  if (!(num in numbers)) {
    return num + ' is not in range';
  }
  if (num == 2) {
    return num + ' is prime'
  }
  for (var i = 2; i < num; i++) {
    if (num % i === 0) {
      return num + ' is not prime';
    }
  }
  return num + ' is prime';

}

console.log(checkPrime(27));

答案 2 :(得分:0)

我已经重写了您的代码并进行了一些更改。

你遇到问题的原因是你在for循环中返回意味着所有奇数都会将自己声明为素数。

我已经解决了这个问题,但我也重新安排了一些事情,为了尽可能高效,我们尽快保释好,所以我做了几张保释我最初检查数字是否在范围内,如果不是保释金。

我已经对代码进行了评论,因此它很有意义,但如果你不理解为什么我做了些什么,请随意提问。

&#13;
&#13;
// make an array of all numbers between 0 and 10000
numbers = [];
for (x = 0; x <= 1e4; x++) {
  numbers.push(x)
}

function checkPrime(num) {
  // return if input number is not in numbers array
  if (numbers.indexOf(num) == -1) return num + ' is not in range'

  // return if number is 0 or 1
  if (num <= 1) return 'It is a separate case'

  // check all numbers between 2 and input number
  // return if any number devides neatly
  for (var i = 2; i < num; i++)
    if (num % i === 0) return num + ' is not prime';

  // if you get this far it's prime
  return num + ' is prime';
}

console.log(checkPrime(27));
&#13;
&#13;
&#13;

就个人而言,就个范围而言,我不会拥有所有价值观的数组,但我还是留下了这个,以防万一我们不知道其他推理。

修改

正如您所说的那样,初始数组并不重要,我已经重新编写了没有它的代码,但这次我没有包含注释(为了节省空间),但代码也是如此事情并没有改变。

&#13;
&#13;
function checkPrime(num) {
  if (num < 0 || num > 1e4) return num + ' is not in range'
  if (num <= 1) return 'It is a separate case'
  for (var i = 2; i < num; i++)
    if (num % i === 0) return num + ' is not prime';
  return num + ' is prime';
}

console.log(checkPrime(27));
&#13;
&#13;
&#13;

无论如何,我希望你能找到这个有用的