2013-06-29 90 views
2
function primeNumbers(n) { 
    array = []; 
    for (var i = 2; array.length < n; i++) { 
     for (var count = 2; count < i; count++) { 
      var divisorFound = false; 
      if (i % count === 0) { 
       divisorFound = true; 
       break; 
      } 
     } 
     if (divisorFound == false) {array.push[i];} 
    } 
    return array; 
} 

當我運行這段代碼時,它似乎陷入了無限循環,並且不會返回任何內容......爲什麼?Javascript:找到前n個素數

回答

3

嘗試把此行的第二循環開始前:

var divisorFound = false; 

所以這條線可以訪問它:

if (divisorFound == false) {array.push(i);} 

採取注固定的Array.push(I)爲NPE說的。 :)

您可能想要在JavaScript中閱讀關於Variable Scope的文章。

+0

感謝,把線VAR divisorFound = FALSE;在第二個循環解決了我的另一個問題之前,該函數正在生成第二個到第n + 1個素數而不是第n個素數。是否也可以通過逗號而不是換行符來分隔素數? – bard

+0

很高興能幫到你! XD – jomsk1e

1

在你的代碼中,array.push[i](帶方括號)不會做你想要的。它保持陣列不變並返回undefined

你的意思是array.push(i)(帶圓括號)。

+0

謝謝你,我一直忘了推工程用括號而不是方括號... – bard

0

此外,你永遠不會爲array定義長度,所以for循環無法知道何時停止。

0

實際上,如果你只是檢查它的sqrt(n),實際上它會發現n個素數更優化[o(n * sqrt(m))]。如果它不能被n的平方根整除,它也不能被n整除。 這裏有一個例子:

(function(n){ 
 
var primes=[]; 
 
    for (var i=1;i<n;i++){ 
 
     var prime=true; 
 
     var rootI=Math.sqrt(i)+1; 
 
     for (var j=2;j<rootI;j++){ 
 
      if (i%j==0) {prime=false;break;} 
 
     }; 
 
     if (prime) primes.push(i); 
 
    } 
 
    document.write(primes.join('-')); 
 
})(100000)

-1

的imana97 answare是不正確的,因爲 「1」 是不是素數,而 「2」 就是它了。 所以,我的修改後的版本是:

(function(n){ 
 
var primes=[2]; 
 
    for (var i=3;i<n;i++){ 
 
     var prime=true; 
 
     var rootI=Math.sqrt(i)+1; 
 
     for (var j=2;j<rootI;j++){ 
 
      if (i%j==0) {prime=false;break;} 
 
     }; 
 
     if (prime) primes.push(i); 
 
    } 
 
    document.write(primes.join('-')); 
 
})(100000)

0

這不是要做到這一點最先進的方法。使用篩子會更好。然而,這是相當不錯的,併爲接近質數碼挑戰提供了一個很好的起點。

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

    while (arr.length < n) { 
    if (isPrime(i)) { 
     arr.push(i) 
    } 
    i++ 
    } 
    return arr; 

    /* 
    * @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 
    } 

}