簡體   English   中英

求250以內的素數之和

[英]finding sum of prime numbers under 250

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 以下所有質數的總和。我收到一個錯誤,說 i 在語句中無效if (i % factor = 0)我知道是在原始 for 語句中創建的,但是有有什么方法可以在 if 語句中引用它?

對於素數計算,您是否考慮過使用埃拉托色尼篩法 這是一種更優雅的確定素數的方法,並且對結果求和也很簡單。

 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 個素數

您必須通過實際檢查實際計數來驗證這一點,因為有兩個終止條件 (1) 我們達到了篩子的極限並且找不到更多素數,或者 (2) 我們實際上找到了我們正在尋找的東西。

如果您將數字增加到遠大於 250 的數字,那么 Sieve 將不再可用,因為它會消耗大量內存。 無論如何,我認為這一切都有意義嗎? 在這一點上,你真的需要自己玩 Sieve,而不是依賴我對它的解釋。

你可以同樣使用這個

 let sum = 0; let num = 250; for (let i = 2; i < num; i++) { let isPrime = true; for (let j = 2; j < i; j++) { if (i % j === 0) { isPrime = false; } } if (isPrime) { sum += i; } } console.log(sum);

i % factor === 0

使用===進行比較。 =用於賦值。 是的,我說三重等於。 類型強制很煩人。

這是一個相當不錯的方法。 它不如篩子先進,但它是一個不錯的起點。 注意:我使用的是 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
  }

}

你需要一個===== : if (i % factor == 0)

所以我不得不面對類似的挑戰,這是我的解決方案,希望對您有所幫助:

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

根據“埃拉托色尼篩”,我已經使用 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(","));

這是遍歷數組並實現 Eratosthenes 篩的一種簡單方法......

 function sumPrimes(num) { var t, v = [], w = [], x = [], y = [], z = 0; //enumerating Vee array starts at 2 as first prime number for (let a = 2; a <= num; a++) { v.push(a) } //creating a moving loop by splicing its first index for (let i = 0; i < v.length; i) { //ensure all items spliced t = v[i]; // t as prime to be removed from Vee array x.push(t); // x storage of primes z += t // total of peculiar primes w.push(v.splice(i, 1)) //tested to move all one by one // prompt(v) //tested that v loses its v[i] every iteration //= now trying to remove others using remainder (%) vs prime t for (let vi in v) { v[vi] % t === 0 ? y.push(v.splice(vi, 1)) : ""; //recursive removal of composite items by prime t } } return z // returns sum of primes } sumPrimes(250);

您生成以 2 作為第一個素數的數組,您使用 % === 0 通過素數的剩余部分篩選數組刪除項目。您使用下一個素數循環遍歷剩余的數組,直到最后一個剩余的素數被推送到素數數組。 將所有素數相加得到總和。

如果問題純粹是學術性的,則更早的答案更合適。

下面的示例使用現代庫,以防您需要一個有效的解決方案。

import {generatePrimes} from 'primes-generator';
import {from, reduce, take} from 'rxjs';

from(generatePrimes())
    .pipe(take(250), reduce((a, c) => a + c))
    .subscribe(sum => {
        // sum = 182109
    });

在性能方面,它將花費不到 1 毫秒的時間。


PS我是素數生成器庫的作者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM