经典 JS 素数

Classic JS Prime Number

这可能很愚蠢 post,但我不明白为什么我的代码不能正常工作。作为记录,我已经编写了不同的有效代码,但我仍然不明白为什么这个不行。

为什么第二个 if 语句始终为真?

https://jsfiddle.net/vhdh5x3d/2/

/* This code doesn't work... */
var testNumber = prompt("Please enter a number you'd like to test");

for (var i = 2; i < testNumber; i++) {
    if (testNumber % i == 0) {
    document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is not a prime number.";
  }
  if ((testNumber - 1) == i && testNumber % i != 0 ) {
    document.getElementById("test-results").innerHTML = "Congratulations! Your number, " + testNumber + ", is a prime number!";
  }
}
var testNumber = prompt("Please enter a number you'd like to test");
for (var i = 2; i < testNumber; i++) {
  if (testNumber % i == 0) {      
     break;//already found a working number, so stop
  }
}
//if last iteration reached without breaking its a prime
document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is "+(testNumber==i?"a":"not a")+" prime number.";

http://jsbin.com/qabivasiyu/edit?console

正如评论已经指出的那样,第二个 if 不应该在 for 循环中,第一个 if 应该中断循环。我还稍微简化了您的代码...

您的代码似乎假设,给定一个正整数 testNumber 和另一个正整数 i,然后如果 ((testNumber - 1) == i) && ((testNumber % i) != 0) 则意味着 testNumber 是素数。

这个假设是错误的。例如考虑 testNumber = 8i = 7 的情况。上述条件成立,但8不是质数。

第二个 if 并不总是正确的,它仅在 for 循环的最后一次迭代中出现,因此您在 html 中看到的是找到素数的消息。

你应该这样做:

var testNumber = prompt("Please enter a number you'd like to test");
var prime = true;
for (var i = 2; i < testNumber; i++) {
    if (testNumber % i == 0) {
      prime = false;

  }
}

if (prime == true) 
  document.getElementById("test-results").innerHTML = "Congratulations! Your number, " + testNumber + ", is a prime number!";
else
  document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is not a prime number.";

这是一个简单的算法,用于测试一个数字是否为素数。为此,您可以找到很多不同的算法。

第二个 If 语句不会总是为真。它只会在最后一次迭代期间进入您的第二个 if 语句并设置 html。 一旦满足您的条件,您总是需要 return 该值,而您在代码中没有这样做。

下面的代码可以工作:

var testNumber = prompt("Please enter a number you'd like to test");

for (var i = 2; i < testNumber; i++) {
    if (testNumber % i == 0) {
    document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is not a prime number.";
return;
  }
  if ((testNumber - 1) == i && testNumber % i != 0 ) {
    document.getElementById("test-results").innerHTML = "Congratulations! Your number, " + testNumber + ", is a prime number!";
return;
  }
}