如何汇总所有素数?

时间:2015-06-24 16:34:29

标签: javascript arrays

我正在制作一个练习,将2中的所有素数加到参数上。我在代码中已经做了这么多,但我被卡住了。我相信通过使用拼接功能,我实际上是因为索引更改而跳过元素。

function sumPrimes(num) {
  var primearray = [];
  var sum = 0;
  for(var i =2; i <= num; i++){
    primearray.push(i);
  }

  for(var j = 0; j < primearray.length; j++) {
    console.log(primearray[j]);
    if ((primearray[j]%2===0) && (primearray[j] >2)) {
      primearray.splice(j,1);
    } else if ((primearray[j]%3===0) && (primearray[j] > 3)) {
      primearray.splice(j,1);
      console.log(primearray);
    } else if ((primearray[j]%5===0) && (primearray[j] > 5)) {
      primearray.splice(j,1);
    } else if ((primearray[j]%7===0) && (primearray[j] > 7)) {
      primearray.splice(j,1);
    }
  }
  sum = primearray.reduce();
  return sum;
}

sumPrimes(30);

我还没有使用reduce函数,因为我还在使用if else语句。

11 个答案:

答案 0 :(得分:1)

我发现了同样问题的一个很好的解决方案。 afmeva被发现了。这是它的工作原理。

function isPrime(val){

  //test if number is prime
  for(var i=2; i < val; i++){
    if(val % i === 0){
      return false;
    }
  }
  return true;
}
  

在上面的代码中,我们接受一个数字来确定它是否是素数。然后我们从两个一直循环直到我们的数字减一,因为我们知道我们的数字将被自身和一个整除。如果我们的值的剩余值与当前循环值为零,那么我们知道它不是素数,所以突破并说出来。

     

This article explains very well

function sumPrimes(num) {
  var answer = 0;

  //loop through all numbers from 2 to input value

  for(var i=2; i <= num; i++){   

    //sum only prime numbers, skip all others
    if(isPrime(i)){
      answer += i;
    }
  }
  return answer;
}

sumPrimes(977); // 73156

Here's another good resource

答案 1 :(得分:1)

我已经看到很多人将所有质数放入数组中,为了检查数字是否为质数,他们检查从2到数字是否有余数。 您只需要检查奇数,并且只需要计数到一半就可以了,因为一个数字不能被任何大于它的数字整除。 这是我的解决方案:

function sumPrimes(num){
    var sum = num>=2?2:0;
    for(var i=3;i<=num;i+=2){
        var isPrime=true;
        for(var j=3;j<(i/2);j++){
            if (i%j==0)
            {
                isPrime=false;
                break;
            }
        }
        sum+=isPrime?i:0;
    }
    return sum;
}

注意:我从j = 2开始,因为我们只检查奇数,所以它们永远不会被2整除。

答案 2 :(得分:0)

这样的事情?

function isPrime(_num) {
	for(var i = 2; i < _num; i++) {
		if(!(_num % i)) {
			return false
		}
	}
	return true;
}


function sumPrimes(_num) {
	var sum = 0;
	for(var i = 2; i <= _num; i++) {
		if(isPrime(i)) {
			sum += i;
		}
	}
	return sum;
}

sumPrimes(20) // 77
sumPrimes(5) // 10

答案 3 :(得分:0)

你也可以这样做。

&#13;
&#13;
function sumPrimes(num) {
    var sum = 0;
    for (var i = 0; i <= num; i++) {
        if (isPrime(i)) {
            sum += i;
        }
    }
    return sum;
}

function isPrime(n) {
    if (n < 2) { return false; }
    if (n !== Math.round(n)) { return false; }
    var result = true;
    for (var i = 2; i <= Math.sqrt(n); i++) {
        if (n % i === 0) {
            result = false;
        }
    }
    return result;
}
&#13;
&#13;
&#13;

答案 4 :(得分:0)

这是我的解决方案。我希望您能够轻松解读:

dataType : 'json'

答案 5 :(得分:0)

function sumPrimes(num) {
  var sumArr= [];
  for(var i=0;i<=num;i++){
    if(isPrime(i))
      sumArr.push(i);
  }

  sumArr = sumArr.reduce(function(a,b){
    return a+b;
  })

  return sumArr;
}

function isPrime(num) {
    if(num < 2) return false;
    for (var i = 2; i < num; i++) {
        if(num%i === 0)
            return false;
    }
    return true;
}

sumPrimes(10);

答案 6 :(得分:0)

function sumPrimes(num) {
    let arr = Array.from({length: num+1}, (v, k) => k).slice(2); 
  
  let onlyPrimes = arr.filter( (n) => { 
    let m = n-1;
    while (m > 1 && m >= Math.sqrt(n)) { 
      if ((n % m) === 0) 
        return false;
        m--;
    }
      return true;
  });
    return onlyPrimes.reduce((a,b) => a+b); 
}
sumPrimes(977);

答案 7 :(得分:0)

这是我求n个质数之和的解决方案

function sumOfNPrimeNumber(num){
	var sum = 0;
	
	const isPrime = function(n){
		if (isNaN(n) || !isFinite(n) || n%1 || n<2) {
			return false;
		}

		if (n%2==0){
			return (n==2);
		}

		var sqrt = Math.sqrt(n);
		for (var i = 3; i < sqrt; i+=2) {
			if(n%i == 0){
				return false;
			}
		}

		return true;
	}

	const getNextPrime = function* (){
		let nextNumber = 2;
		while(true){
			if(isPrime(nextNumber)){
				yield nextNumber;
			}
			++nextNumber;
		}
	}

	
	const nextPrime = getNextPrime();
	for (var i = 0; i < num; i++) {
		sum = sum + nextPrime.next().value;
	}

	return sum;
}

console.log(sumOfNPrimeNumber(3));

答案 8 :(得分:0)

以上所有答案都使用了辅助功能,或者不是省时的。 这是 O(n)时间的快速递归解决方案:

// @ signature int -> int
// @ interpr: returns sum of all prime integers <= num
// assume: num is positive integer

function sumPrimes(num) {
  if (num <= 2) {
    return 2;
  }

  let i = 2;
  while (i < num) {
    if (num % i === 0) {
      return sumPrimes(num - 1)
    }
    i++;
  }
  
  return num + sumPrimes(num - 1)
}

// test
sumPrimes(10); // -> 17

答案 9 :(得分:-1)

这就是我为获得素数而做的。我不知道它是否效率最高,但它确实有效。这是Java,但可以很容易地转换为JavaScript。希望这有助于指明您正确的方向。

final int TOTAL = 10;
int primes[] = new int[TOTAL];
int arrPos = 2;
boolean prime = false;
primes[0] = 2;

for (int i = 2; i < TOTAL; i++) {
  prime = false;
  int sqrt = (int) Math.sqrt(i);
  for (int j = 1; j < arrPos && primes[j] < sqrt; j++) {
    if (i % primes[j] != 0) {
      prime = true;
    } else {
      prime = false;
      break;
    }
  }

  if (prime == true) {
    primes[arrPos] = i;
    arrPos++;
  }
}

答案 10 :(得分:-1)

function prime_sum(num){
let count=0;        *//tracks the no of times number is divided perfectly*
   for(let i=1;i<=num;i++){        *//from 1 upto the number*
      if(num%i==0){count++};
}
if(count===2){return "Prime"};
return{"Not prime"};
}
console.log(prime_sum(10));//expected output is 17**

//代码接收一个数字,检查范围,满足条件返回素数