2012-10-12 16 views
0

它必須僅包含函數,變量,循環等(基本內容)。我從現在開始學習的代碼從頭開始有困難(應該可以做到)。讓我非常生氣:/。 如果你可以一步一步給我,以確保我明白我真的很感激。感謝一堆先進的。使用比此更簡單的代碼計算從2到100的素數

我怎麼能得到一個比這更簡單的代碼相同的結果:淘氣今天這麼

var primes=4; 
for (var counter = 2; counter <= 100; counter = counter + 1) 
{ 
    var isPrime = 0; 
    if(isPrime === 0){ 
     if(counter === 2){console.log(counter);} 
     else if(counter === 3){console.log(counter);} 
     else if(counter === 5){console.log(counter);} 
     else if(counter === 7){console.log(counter);} 
     else if(counter % 2 === 0){isPrime=0;} 
     else if(counter % 3 === 0){isPrime=0;} 
     else if(counter % 5 === 0){isPrime=0;} 
     else if(counter % 7 === 0){isPrime=0;} 
     else { 
      console.log(counter); 
      primes = primes + 1; 
     } 
    } 
} 
console.log("Counted: "+primes+" primes"); 
+1

相關:[Eratosthenes的篩子](https:// en。 wikipedia.org/wiki/Sieve_of_Eratosthenes) – icktoofay

+0

我想先嚐試理解代碼。這很簡單。你可能會因簡單而容易混淆。 – sachleen

+4

我不知道爲什麼「if(isPrime == 0)」在分配「isPrime = 0」後是正確的。那'如果'是無用的 – jondinham

回答

1

此發現2和100之間的所有質數:

var primes=0; 
var isprime = true; 
for (var counter = 2; counter <= 100; counter = counter + 1) 
{ 
    // For now, we believe that it is a prime 
    isprime = true; 
    var limit = Math.round(Math.sqrt(counter)); // See comment from @AresAvatar, below 
    // We try to find a number between 2 and limit that gives us a reminder of 0 
    for (var mod = 2; mod <= limit; mod++) { 
     // If we find one, we know it's not a prime 
     if (counter%mod == 0) { 
      isprime = false; 
      break; // Break out of the inner for loop 
     } 
    } 

    if (isprime) { 
     console.log(counter, limit); 
     primes = primes + 1; 
    } 
} 
console.log("Counted: "+primes+" primes"); 
+0

我一直在尋找這個..謝謝一堆我現在試着去理解它。爲什麼你需要將isprime設置爲true? (我知道是在我發佈的代碼中,我也沒有得到它)​​ – RufioLJ

+0

假設它是總理,然後做測試,看看它不是。 – sachleen

+1

我想說這個代碼會比原來的效率低很多 –

5

我感覺:

function printPrimesBetweenTwoAndOneHundredSimply(){ 

    var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97], 
    i, 
    arrayLength = primes.length; 

    for(i = 0; i < arrayLength; i++){ 
    console.log(primes[i]); 
    } 

    console.log("Counted: " + arrayLength + " primes"); 
} 
+0

可怕的答案,但給了我一個笑聲... +1 – sachleen

+0

我可能誤解了這個問題,但你的答案給出了素數值<100,而不是前100個素數。 ;-) – Mike

+1

@Mike是的,但如果你看看上面的代碼,它也是。 –

4

首先,你真的不需要爲此使用===。標準==就足夠了。其次,你可以做所有這些都是同一種東西線,除了單個數字成一條線:

var primes=4; 
for (var counter = 2; counter <= 100; counter = counter + 1) 
{ 
    var isPrime = 0; 
    if(isPrime == 0){ 
     if(counter == 2 || counter == 3 ||counter == 5 || counter == 7)console.log(counter); 
     else if(counter % 2 == 0 || counter % 3 == 0 || counter % 5 == 0 || counter % 7 == 0)isPrime=0; 
     else { 
      console.log(counter); 
      primes = primes + 1; 
     } 
    } 
} 
console.log("Counted: "+primes+" primes"); 

您還會注意到{}是上幾行刪除。這是因爲在if之後的一行代碼總是被認爲是嵌套的。

接下來,我們可以將您的primes = primes + 1;更改爲:primes++;,它只是告訴primes自己增加1。您的櫃檯也可以做同樣的事情。我們也知道,isPrime等於「0」,因爲你把它設置爲一秒鐘前,所以我們不再需要一個if聲明:

var primes=4; 
for (var counter = 2; counter <= 100; counter++) 
{ 
    var isPrime = 0; 
    if(counter == 2 || counter == 3 ||counter == 5 || counter == 7)console.log(counter); 
    else if(counter % 2 == 0 || counter % 3 == 0 || counter % 5 == 0 || counter % 7 == 0)isPrime=0; 
    else { 
     console.log(counter); 
     primes++; 
    } 
} 
console.log("Counted: "+primes+" primes"); 

接下來,我們可以做一個否定的檢查(的!=代替==)價值和結合您的else if與您的else。因爲我們正在做一個否定的檢查(這種情況),我們必須將OR S(||)切換到AND S(&&):

var primes=4; 
for (var counter = 2; counter <= 100; counter++) 
{ 
    if(counter == 2 || counter == 3 ||counter == 5 || counter == 7)console.log(counter); 
    else if(counter % 2 != 0 && counter % 3 != 0 && counter % 5 != 0 && counter % 7 != 0) { 
     console.log(counter); 
     primes++; 
    } 
} 
console.log("Counted: "+primes+" primes"); 

還有許多其他的方式來寫,但我覺得它更有利於你使用你開始使用的東西,並從那裏縮短它。

+0

這真是一個很好的答案!感謝一羣人一步一步地指導我。我希望我可以選擇兩個最佳答案。 – RufioLJ

+1

你說得對,'=='可以工作,但'==='沒有錯,這通常是一個好習慣。 – icktoofay

+0

@RufioLJ你也可以接受這個,而不是... –

0

當然「簡單」沒有定義。 :-)

以下可以做得更短,但有一點內置的魯棒性

// Get primes from 0 to n. 
// n must be < 2^53 
function primeSieve(n) { 

    n = Number(n); 
    if (n > Math.pow(2, 53) || isNaN(n) || n < 1) { 
    return; 
    } 

    var primes = []; 
    var notPrimes = {}; 
    var num; 

    for (var i=2; i<n; i++) { 
    for (var j=2; j<n/2; j++) { 
     num = i*j; 
     notPrimes[num] = num; 
    } 
    if (!(i in notPrimes)) { 
     primes.push(i); 
    } 
    } 
    return primes 
} 

所以,如果你想少代碼:

// Get primes from 0 to n. 
// n must be < 2^53 
function primeSieve2(n) { 
    var primes = [], notPrimes = {}; 
    for (var i=2; i<n; i++) { 
    for (var j=2; j<n/2; j++) 
     notPrimes[i*j] = i*j; 
    i in notPrimes? 0 : primes.push(i); 
    } 
    return primes 
} 
-3

這將是更簡單你的問題....

for (int i = 2; i < 100; i++) { 
int j = 0; 
for (j = 2; j < i; j++) 
    if ((i % j) == 0)break; 
     if (i == j) 
     System.out.print(" " + i);} 
+1

-1格式不正確的代碼。儘管這不是必需的,但無論如何,最好還是佩戴大括號。問題被標記爲javascript,而不是java。 – sachleen

0

這是非常簡單的(我的意思是,短):

console.log(2); console.log(3); 
var m5=25, m7=49, i=5, d=2, c=2; 
for(; i<100; i+=d, d=6-d) 
{ 
    if(i!=m5 && i!=m7) { console.log(i); c+=1; } 
    if(m5 <= i) m5+=10; 
    if(m7 <= i) m7+=14; 
} 
c 

這是一個 「展開」 sieve of Eratosthenes2-3-wheel factorization。一方面,我們列舉了所有小於100(大於3)與2和3互斥的數字,作爲5 + 2 + 4 + 2 + 4 + ...的部分和數,這樣這樣列舉的數字中沒有2和3的倍數。另一方面,我們通過將它們列舉爲25 + 10 + 10 + 10 + ...和49 + 14 + 14 + 14 +的部分和,從其中除去所有5和7的倍數。 ..。 2和3的倍數首先不存在,並且需要被Eratosthenes濾網丟棄的11的第一倍是121.