найти сумму простых чисел до 250 - PullRequest
3 голосов
/ 04 февраля 2012
var sum = 0

for (i = 0; i < 250; i++) {

    function checkIfPrime() {

        for (factor = 2; factor < i; factor++) {
            if (i % factor = 0) {
                sum = sum;
            }
            else {
                sum += factor;
            }
        }
    }
}

document.write(sum);

Я пытаюсь проверить сумму всех простых чисел младше 250. Я получаю сообщение об ошибке, в котором говорится, что я недопустим в утверждении if (i % factor = 0) Я знаю, что он создавался в исходном утверждении for, но есть ли способ ссылаться на него в операторе if?

Ответы [ 7 ]

10 голосов
/ 04 февраля 2012

С первичным вычислением вы рассматривали возможность использования Сито Эратосфена ? Это гораздо более элегантный способ определения простых чисел, и суммирование результатов просто.

var sieve = new Array();
var maxcount = 250;
var maxsieve = 10000;

// Build the Sieve, marking all numbers as possible prime.
for (var i = 2; i < maxsieve; i++)
    sieve[i] = 1;

// Use the Sieve to find primes and count them as they are found.
var primes = [ ];
var sum = 0;
for (var prime = 2; prime < maxsieve && primes.length < maxcount; prime++)
{
    if (!sieve[prime]) continue;
    primes.push(prime); // found a prime, save it
    sum += prime;
    for (var i = prime * 2; i < maxsieve; i += prime)
        sieve[i] = 0; // mark all multiples as non prime
}

document.getElementById("result").value =
      "primes: " + primes.join(" ") + "\n"
    + "count: " + primes.length + "\n"
    + "sum: " + sum + "\n";
#result {
    width:100%;
    height:180px
}
<textarea id="result">
</textarea>

(РЕДАКТИРОВАТЬ) С обновленным алгоритмом теперь задействованы два максимума:

  • maxcount - максимальное количество простых чисел, которое вы хотите найти
  • maxsieve - это предположение о сите, достаточно большом, чтобы содержать maxcount простых чисел

Вы должны будете проверить это, фактически проверив действительный count , поскольку есть два условия завершения (1) мы достигли предела нашего сита и не можем найти больше простых чисел, или (2) мы фактически нашел то, что мы ищем.

Если вы увеличите число до чисел, намного превышающих 250, сито больше не станет жизнеспособным, поскольку будет потреблять большие объемы памяти. Во всяком случае, я думаю, что все это имеет смысл, верно? В этот момент вам действительно нужно поиграть с Ситом, а не полагаться на мою интерпретацию.

4 голосов
/ 06 июля 2015
function sumPrimes(num) {
  var allprimes=[];
  for(i=2;i<=num;i++){
       var notPrime = true;
        for(j=2 ;j<=i;j++){
            if(i%j===0 && i!==j){
                notPrime = false;
            }
          }

    if(notPrime === true){
        allprimes.push(i);
    }
  }

  var addPrimes = allprimes.reduce(function(a,b){
     return a+b;
  });

  console.log(addPrimes);
}

sumPrimes(250);

Вы можете в равной степени использовать это;

3 голосов
/ 04 февраля 2012

i % factor === 0

Используйте === для сравнения.= для назначения.Да, я сказал тройной равно.Тип принуждения раздражает.

1 голос
/ 31 августа 2017

Вот довольно приличный способ сделать это. Он не такой продвинутый, как сито, но это достойная отправная точка. ПРИМЕЧАНИЕ. Я использую синтаксис ES6.

 /*
 * Sum the first n prime numbers
 *
 * @param n (integer)
 * @return integer 
 *
 */
function sumNprimes(n){
  const arr = [];
  let i = 2

  while (arr.length < n) {
    if (isPrime(i)) {
      arr.push(i)
    }
    i++
  } 
  return arr.reduce( (x,y) => x+y );

  /*
  * @param n (integer)
  * @return Boolean
  *
  */
  function isPrime(n) {

    if ( n < 2 ) {
      return false
    }

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

}
1 голос
/ 04 февраля 2012

Вам нужно == или ===: if (i % factor == 0)

0 голосов
/ 23 апреля 2019

Согласно « Сите Эратосфена », я реализовал код, используя JS:

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);
};

var val = 250;

let outArr = [];
for(let i=2;i<val;i++){
  if(isPrime(i)){
    outArr.push(i);
  }  
}
console.log("Prime number between 0 - "+val+" : "+outArr.join(","));
0 голосов
/ 14 сентября 2016

Так что мне пришлось столкнуться с подобной проблемой, и вот мое решение, надеюсь, вы найдете его полезным:

 function sumPrimes(num) {

      // determine if a number is prime
      function isPrime(n) {
        if (n === 2) return true;
        if (n === 3) return true;
        if (n % 2 === 0) return false;
        if (n % 3 === 0) return false;

        var  i = 5;
        var  w = 2;
        while (i * i <= n) {
            if (n % i === 0) {
                return false;
            }
            i += w;
            w = 6 - w;
        }
        return true;
      }

      // subtract 1 for 'not being prime' in my context
      var sum = isPrime(num) ? num - 1 : -1;

      for (var x = 0; x < num; x++) {
        if (isPrime(x) === true) {
          sum += x;
        }
      }

      return sum;
    }
...