Javascript:数字素数测试

Joh*_*nua 20 javascript

我正在尝试完成代码检查挑战,要求您检查数字是否为素数.无论出于何种原因,我的解决方案似乎不适用于奇素数的平方(例如9返回true而不是false).

function isPrime(num) {

  if (num === 2) {
    return true;
  }
  else if(num > 1){
    for (var i = 2;  i < num; i++) {

      if (num % i !== 0 ) {
        return true;
      }

      else if (num === i * i) {
        return false
      }

      else {
        return false;
      }
    }
  }
  else {
    return false;
  }

}

console.log(isPrime(121));
Run Code Online (Sandbox Code Playgroud)

Ps我包括第二个else/if语句,因为我试图解决问题.

Iho*_*yuk 92

尽可能简单:

function isPrime(num) {
  for(var i = 2; i < num; i++)
    if(num % i === 0) return false;
  return num > 1;
}
Run Code Online (Sandbox Code Playgroud)

使用ES6语法:

const isPrime = num => {
  for(let i = 2; i < num; i++)
    if(num % i === 0) return false;
  return num > 1;
}
Run Code Online (Sandbox Code Playgroud)

您也可以从降低算法的复杂度O(n),以O(sqrt(n))如果您运行的循环,直到一些平方根:

const isPrime = num => {
    for(let i = 2, s = Math.sqrt(num); i <= s; i++)
        if(num % i === 0) return false; 
    return num > 1;
}
Run Code Online (Sandbox Code Playgroud)

  • @ Saka7这是一个非常有用的答案,特别是因为`sqrt`优化,我没有考虑过.@zerkms建议只检查奇数(当然大于两个),这是我期望在优化的解决方案中看到的.您可以通过这种方式大大优化解决方案.我做了[这个JSPerf测试](https://jsperf.com/math-isprime/1)来演示.谢谢,你们俩指导BTW. (4认同)
  • 而不是 `return num !== 1 &amp;&amp; num !== 0;` 你可以只使用条件 `return num &gt;= 2;` 因为素数必须是大于 1 的自然数。 (3认同)
  • 对"4"的平等检查是什么?人们也可能只检查奇数. (2认同)
  • 所以让它`i &lt;= s`并删除那个丑陋的硬编码条件? (2认同)
  • `isPrime(0)` 返回 `true`,事实并非如此。为了使函数在数学上正确,您需要在 return 语句中添加另一个条件:`return num !== 1 &amp;&amp; num !== 0;` (2认同)
  • 但是不是已经找到了所有素数(直到一些非常大的数字)吗?为什么我们要不断地计算它们? (2认同)

Gee*_*eky 23

这里有一个小小的建议,你为什么要为整个n个数运行循环?

如果一个数字是素数,它将有2个因子(1和数字本身).如果它不是素数,它们将有1,数字本身等等,你不需要运行循环直到数字,可能你可以考虑运行它直到数字的平方根.

你可以通过欧拉的主要逻辑来做到这一点.检查以下代码段:

function isPrime(num) {
  var sqrtnum=Math.floor(Math.sqrt(num));
    var prime = num != 1;
    for(var i=2; i<sqrtnum+1; i++) { // sqrtnum+1
        if(num % i == 0) {
            prime = false;
            break;
        }
    }
    return prime;
}
Run Code Online (Sandbox Code Playgroud)

现在复杂度是O(sqrt(n))

更多信息 为什么我们检查素数的平方根以确定它是否是素数?

希望能帮助到你


小智 9

酷版:

const isPrime = n => ![...Array(n).keys()].slice(2).map(i => !(n%i)).includes(true) && ![0,1].includes(n)
Run Code Online (Sandbox Code Playgroud)

  • 您能详细说明一下吗? (2认同)
  • 就时间复杂度而言,解决方案效率低下。 (2认同)

Mar*_*icz 6

function isPrimeNumber(n) {
  for (var i = 2; i < n; i++) { // i will always be less than the parameter so the condition below will never allow parameter to be divisible by itself ex. (7 % 7 = 0) which would return true
    if(n % i === 0) return false; // when parameter is divisible by i, it's not a prime number so return false
  }
  return n > 1; // otherwise it's a prime number so return true (it also must be greater than 1, reason for the n > 1 instead of true)
}

console.log(isPrimeNumber(1));  // returns false
console.log(isPrimeNumber(2));  // returns true
console.log(isPrimeNumber(9));  // returns false
console.log(isPrimeNumber(11)); // returns true
Run Code Online (Sandbox Code Playgroud)


Tom*_*chi 6

function isPrime(num) {
  if (num <= 1) return false; // negatives
  if (num % 2 == 0 && num > 2) return false; // even numbers
  let s = Math.sqrt(num); // store the square to loop faster
  for(let i = 3; i <= s; i++) { // start from 3, stop at the square, increment
      if(num % i === 0) return false; // modulo shows a divisor was found
  }
  return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 请在您的代码中添加说明。它可以帮助人们理解算法,因此他们可以适应它,而不仅仅是复制您的代码。 (2认同)
  • 在 9 上失败,因为 sqrt(9) = 3,并且您的循环不会被调用。尝试`i &lt;= s` (2认同)

H S*_*ogr 6

质数的形式为 6f ± 1,不包括 2 和 3,其中 f 是任何整数

 function isPrime(number)
 { 
   if (number <= 1)
   return false;

   // The check for the number 2 and 3
   if (number <= 3)
   return true;

   if (number%2 == 0 || number%3 == 0)
   return false;

   for (var i=5; i*i<=number; i=i+6)
   {
      if (number%i == 0 || number%(i+2) == 0)
      return false;
   }

   return true;
 }
Run Code Online (Sandbox Code Playgroud)

解的时间复杂度:O(sqrt(n))


小智 5

// A list prime numbers

function* Prime(number) { 
  const infinit = !number && number !== 0;
  const re = /^.?$|^(..+?)\1+$/;  
  let actual = 1;
 
  while (infinit || number-- ) {
      if(!re.test('1'.repeat(actual)) == true) yield actual;
      actual++
  };
};

let [...primers] = Prime(101); //Example
console.log(primers);
Run Code Online (Sandbox Code Playgroud)

  • 非常有趣的解决方案,但我不知道这里发生了什么(使用正则表达式生成素数序列?)你能解释一下吗? (4认同)