将所有素数加到一定数量

时间:2019-06-14 04:16:35

标签: javascript primes

我应该编写一种算法,该算法返回所有素数之和直到一定数量(自变量),包括自变量本身。这段代码似乎运行良好(我在较小的数字上进行了测试),但是一定存在一个错误,因为当我通过 977 作为参数时,程序将返回 108789 ,这可能是不正确的。根据freecodecamp.org的说法,它应该返回 73156 。在添加值之前,我已经检查了数组,但是在这里看不到问题。

function sumPrimes(num) {
  function isPrime(n){
   return ((n/2 === 1 || n/3 === 1 || n/5 === 1 || n/7 === 1)?true: 
     (n%2===0 || n%3 === 0 || n%5 ===0 || n%7 === 0)? 
     false:true);
  };

  let result = [];
  let final;

  for(let i = 2; i <= num; i++){
    if(isPrime(i)){
      result.push(i);
    }
  }

  final = result.reduce((x,y) => x + y);

  console.log(final); // returns 108789

}

sumPrimes(977);

5 个答案:

答案 0 :(得分:3)

您的isPrime()方法不正确。您可以改为执行以下操作。

编辑:@Amadan指出,算法的复杂度从O(n)降低到O(sqrt(n))

function sumPrimes(num) {

      function isPrime(n){
           for(let i = 2, k = Math.sqrt(n); i <= k; i++)
              if(n % i === 0) 
                 return false; 
           return true;
      };

      let result = [];
      let final;

      for(let i = 2; i <= num; i++){
        if(isPrime(i)){
          result.push(i);
        }
      }

      final = result.reduce((x,y) => x + y); 
      console.log(final); // returns 73156
    }

答案 1 :(得分:2)

您的isPrime是完全错误的。首先,只检查前四个素数的可除性;您应该检查所有素数的可除性,直到确定要测试的数字的平方根。 (如果您现在不想打扰非质数的排序,也可以使用非质数测试。)其次,余数是否为1没什么区别-仅在{ {1}}而非重要的0

素数测试的算法是众所周知的,并且在整个Web上都有描述。首先,请看prime numbers上的Wikipedia进行概述,以及here来了解我假设您要使用的特定算法,尽管对于您的特定用例(所有质数之和小于N), Sieve of Eratosthenes应该更好。

答案 2 :(得分:0)

您的isPrime()函数不正确。如果您想处理除小小的素数以外的任何事情,就不能简单地对素数进行硬编码以进行检查。例如isPrime(143)将返回true,但是143 = 11 * 13则不是素数。

答案 3 :(得分:0)

您的主要功能无法正常工作,您可能需要阅读stackoverflow answerlink有关构建一个功能的信息。但是,您其余的功能似乎按预期运行。

答案 4 :(得分:0)

您使用的方法是错误的,因为它仅检查一定数量的值,这对于大数而言是有问题的。

如上面的答案之一所述,遍历所有数字直到该数字的平方根也是有效的方法,但是还有一种更快,更有效的方法,称为Eratosthenes筛网。

此方法可用于删除我们已经知道为假的结果,而不对其进行计算。

您可以在这里详细了解- Sieve of Eratosthenes