【问题标题】:Issue with prime number test javascript质数测试javascript的问题
【发布时间】:2016-06-21 17:51:41
【问题描述】:

我是初学者,正在尝试完成质数测试,但遇到了问题。这是我所拥有的:

var n = Number(prompt("Input the number you want to check for prime:"));
var i;


if (n < 2) {
    alert(n + " is not a prime number.");
}
for (var i = 2; i <= Math.sqrt(n); i++) {
    if (n % i === 0) {
        alert(n + " is not a prime number.");
        break;
    }

    else {
        alert(n + " is a prime number."); 
        break;
    }
}

它运行正常,但如果我输入 3 或 2 并不会弹出警报,并且任何带有 3 的数字即使不是质数,它也会作为质数返回。除此之外,我的所有测试都有效。

【问题讨论】:

  • 2 和 3 都是素数,问题在于您构建循环的方式。自从您也闯入 else 以来,它第一次就脱离了循环。相反,应该发生的是最终语句应该在循环之外。您还必须完全退出检查,所以我建议a)将其包装为一个函数,以便您可以return,或b)设置一个标志而不是立即警报,所以isPrime = true; break;,然后再检查如果isPrime === true.
  • 那是因为当您宣布n 是素数时,您还没有测试所有除数。

标签: javascript for-loop


【解决方案1】:

啊,您的问题是您构建循环的方式。无论检查是否完成,您都会爆发。

var n = Number(prompt("Input the number you want to check for prime:"));
var i;
var isPrime = true;

if (n < 2) {
    isPrime = false;
} else if (n < 4 && n >= 2) {
    // isPrime is already true
} else if (n % 2 === 0) {
    isPrime = false; // no divisor of 2 can be prime
} else {
  var sqrtN = Math.sqrt(n);
  for (var i = 3; i <= sqrtN; i = i + 2) {
      if (n % i === 0) {
          // Only break out of the loop if a match is found
          isPrime = false;
          break;
      }
  }
}
if (isPrime) {
    alert(n + " is a prime number.");
} else {
    alert(n + " is not a prime number.");
}

或者,一个可能更有条理的解决方案:

function isPrime (n) {
  n = parseInt(n);
  var i;
  if (Number.isNaN(n)) {
    return false;
  } else if (n < 2) {
    // 1 is not prime
    return false;
  } if (n < 4) {
    // 2 and 3 are prime, so why not skip checking them?
    return true;
  } else if (n % 2 === 0) {
    // No number divisible by 2 is prime.
    return false;
  } else {
    // This won't change, so calculate it once as suggested by Weather Vane.
    var sqrtN = Math.sqrt(n);
    // 4, 6, 8... All divisible by 2, and would be caught by initial check.
    for (i = 3; i < sqrtN; i = i + 2) { 
      // Not a prime if it's evenly divisible. 
      if (n % i === 0) {
        return false; 
      }
   }
   // Otherwise prime.
   return true; 
  }
}

【讨论】:

  • 更好的是 a) 只计算一次平方根,b) 特别检查 2,c) 用 for (var i = 3; i &lt;= rootn; i += 2) 跳过偶数除数
【解决方案2】:

当然。如果n % i不是0,则表示i不除n,但不表示n是素数。你必须检查所有i 才能说出来。

此外,不要在每次迭代时重新计算昂贵的Math.sqrt(n)。并注意NaN

var n = Number(prompt("Input the number you want to check for prime:"));
function isPrime(n) {
  if (n < 2 || !n) return false;
  for (var i = 2; i*i <= n; i++) {
    if (n % i === 0) return false;
  }
  return true;
}
alert(n + " is " + (isPrime(n) ? "" : "NOT ") + "a prime number.");

当然,这个算法是指数型的 (pseudo-polynomial)。不要将它用于大n。相反,请参见例如Miller–Rabin primality testAKS primality test,它们是多项式。

【讨论】:

    【解决方案3】:
    var UI = window.prompt("Enter a whole number to test as a prime number: \n", "0");
    var TV = parseInt(UI, 10);
    var HITS = 0;
    var DD = TV;
    while (DD > 0) {
        if (TV % DD === 0) {
            HITS++;
        }
        DD--;
    }
    
    if (HITS > 2) {
        document.write(UI + " is a NOT prime number");
    } else {
        document.write(UI + " is a prime number");
    }
    

    请参考 stackoverflow 中提出的旧问题 link to the old question

    【讨论】:

    • 查质数时,只需要查到数的平方根即可,提示
    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多