[英]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>
(編輯)使用更新的算法,現在涉及兩個最大值:
您必須通過實際檢查實際計數來驗證這一點,因為有兩個終止條件 (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.