【问题标题】:Prime Number Check (JavaScript) [duplicate]质数检查(JavaScript)[重复]
【发布时间】:2021-02-17 06:59:33
【问题描述】:

我编写了以下代码来检查一个数字是否为素数,并且它可以正常工作。但令我惊讶的是,当它传递 25 作为值时,它返回“true”而不是“false”,因为 25 不是质数。

所以我决定分享。请问,我在这里做错了什么?

function isPrime(number) {
   return number % 2 !== 0 && number % 3 !== 0 ? true : false;
}

isPrime(4) returns false;
isPrime(23) returns true;
isPrime(25) returns true; 

"(这是我惊慌的地方。25 也应该返回 false)

【问题讨论】:

  • 提示:您不需要三元来将布尔值转换为布尔值。 !== 已经返回 truefalse
  • 提示:这不是你测试素数的方式。

标签: javascript primes


【解决方案1】:

您的病情非常轻微。如果这个数不能被 2 或 3 整除,但能被 5 或 7 整除怎么办?除了如何 isPrime(23) 返回 false 还可以吗? 23 也是一个素数,它应该返回 true。您需要做的是遍历从 n-1 到 2 的所有数字(这里 n 是您正在检查的数字)并检查是否有任何数字除以 n 而没有余数。您可以执行以下操作,

function isPrime(number) {
    let isPrimeNum = true;
    for(let i = number-1; i>=2; i--) {
      if(number%i === 0) isPrimeNum = false;
    }
    return isPrimeNum;
}

console.log(isPrime(23));
console.log(isPrime(25));

有很多方法可以优化上述解决方案。我把它作为一个挑战,让你自己去发现和做。你可以从here开始。

【讨论】:

  • isPrime(23) 返回 true。这只是一个拼写错误。感谢您的意见。它有帮助
【解决方案2】:

您的代码仅检查输入是否可被 2 或 3 整除。但是,质数(根据定义)是只能被 1 和自身整除的数字。

因此,您必须检查每个小于或等于sqrt(n) 的数字。 (扫描这个区域就够了,好像有一个比这个更大的除数,它一定有一对落在那个范围内。

循环向上迭代,所以它可以提前返回,如果数字可以被一个小素数整除。

function isPrime(number){
  if(number <= 1 || number !== Math.floor(number))
    return false
  const sqrtNumber = Math.sqrt(number)
  for(let n = 2; n <= sqrtNumber; n++)
    if(!(number % n))
      return false
  return true
}


console.log(isPrime(-42)) //false
console.log(isPrime(1)) //false
console.log(isPrime(3.14)) //false
console.log(isPrime(4)) //false
console.log(isPrime(23)) //true
console.log(isPrime(25)) //false

【讨论】:

  • 感谢分享。我非常清楚素数是什么。我只需要检查 0 到 100 之间的小范围。您的解决方案很有帮助,但是 0 和 1 呢?
  • @louismarkin 如果您的号码保证小于 100,那么您必须手动检查(以同样的理由)每个最多 10 的号码,以确保。然而,这段代码总是循环理想的次数,并且可以使用任何数字。
  • @louismarkin 关于 0 和 1 的好点,为它们添加了检查;也适用于非整数
  • 实际上,您正在测试多个偶数。你应该检查它是否能被 2 整除,然后检查它是否能被奇数整除。
  • @BrunoCanettieri 现在,它上升了,早期的回报会解决这个问题。谢谢指出!
猜你喜欢
  • 2013-08-22
  • 2014-12-29
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
相关资源
最近更新 更多