获取前N个质数之和javascript

Get the sum of first N primes javascript

我正在尝试找到前 N 个素数的总和,下面附上了我的代码。我正在为最后一部分而苦苦挣扎(求和)。至此我已经定义了什么是素数,并且得到了前N个素数

function isPrime(number) {
  if (number <= 1) return false;
  if (number === 2) return true;
  else {
    for (let i = 2; i < number; i++) {
      if (number % i === 0) return false;
    }
    return true;
  }
}
console.log(isPrime(6)); //false 

function getNprimes(n) {
  const arr = [];
  let i = 2

  while (arr.length < n) {
    if (isPrime(i)) {
      arr.push(i)
    }
    i++
  }
  return arr;
}
console.log(getNprimes(5)); //[2, 3, 5, 7, 11]

const sumOfNPrimes = (num) => {
  let sum = getNprimes(num);
  if (sum === 0) {
    sum = getNprimes(num + 1)
    return sum;
  }
}
console.log(sumOfNPrimes(4));

检查 sum === 0 将始终 return false 因为 sum 是一个数组并且您使用的是严格相等性检查类型。您应该改为检查 length 属性,并使用 != 运算符(例如,仅当数组的长度不是 0 时才执行代码)。

要计算结果数组的总和,可以使用Array#reduce:

function isPrime(number) {
  if (number <= 1) return false;
  if (number === 2) return true;
  else {
    for (let i = 2; i < number; i++) {
      if (number % i === 0) return false;
    }
    return true;
  }
}
console.log(isPrime(6)); //false 

function getNprimes(n) {
  const arr = [];
  let i = 2

  while (arr.length < n) {
    if (isPrime(i)) {
      arr.push(i)
    }
    i++
  }
  return arr;
}
console.log(getNprimes(5)); //[2, 3, 5, 7, 11]

const sumOfNPrimes = (num) => {
  let sum = getNprimes(num).reduce((a, b) => a + b);
  return sum
}
console.log(sumOfNPrimes(4));

您实现的算法将在 O(N sqrt(N)) 中 运行 并且它正在为每个查询找到总和。 因此,如果您想降低代码的时间复杂度,那么您可以在 O(N log (log N)) 中实现 运行s 的 erastosthenes 筛法,并将素数之和的值存储在 O(N ) 然后以 O(1) 时间复杂度回答所有查询。 下面是这个想法在javascript中的实现:

let primes = [];
let primeSum = [2];
const N = 1000001;

function generatePrimes(){
    let isPrime = [];
    for(let i=1; i<N; i++) isPrime.push(true);
    for(let i=2; i<N; i++){
        if(!isPrime[i]) continue; // if number is not prime
        primes.push(i); // add prime number
        for(let j=2*i; j<N; j += i){
            isPrime[j] = false; // marking all multiples of                  current prime as non prime
        }
    }

// calculate prime sums from 0 index to ith index
    for(let i=1; i<primes.length; i++){
        if(i < 10) console.log(primes[i]);
        primeSum.push(Number(Number(primes[i])+Number(primeSum[i-    1])));
    }
}

generatePrimes();

// answer query in O(1) for n = 10:
const n = 3;
console.log(primeSum[n-1]);

您也可以使用此代码回答 l 到 r 范围查询质数和

ps:抱歉英语不好