2016-08-26 94 views
1

我想寫一個腳本,顯示從0到100的素數,但是當我執行它時,瀏覽器崩潰。 JSHint沒有檢測到任何錯誤。使用Javascript尋找素數

我想了解爲什麼此代碼無效:我無意找到完成相同任務的完全不同的代碼(like this one)。

這是我寫過的第一個代碼,所以我提前道歉所有我忽略的愚蠢錯誤。

var i; 
var m; 
var primeArr = [2, 3, 5, 7, 11, 13, 17, 19]; 
var theMaxNumber = 100; 
var theMinNumber = 21; 
var theCounter = -1; 

function myFunction() { 
     for (i = theMinNumber; i < theMaxNumber; i += 2) { 
      for (m = 0; m < primeArr.length; m++) { 
       if (i % primeArr[m] !== 0) { 
        theCounter++; 
        if (theCounter === primeArr.length) { 
         primeArr.push(i); 
        } 
        if (m === primeArr.length) { 
         theCounter = -1; 
        } 
       } 
      } 
     } 
     console.log(primeArr.toString()); 
    } 

這是應該如何在理論工作:

1)功能找出是否不是數字整除的素數較小然後自己。

2)情況下,它是,theCounter被重置了與由兩個遞增。

3)如果不是,theCounter增加1。如果在週期結束時,對於小於其自身的所有素數都不是可分性的,則意味着它是素數:i被推入陣列中(因爲theCounter = == primeArr。長度),則i增加2。

編輯:我固定在代碼中的所有錯誤,現在完美的作品:

var i; 
var m; 
var primeArr = [3, 5, 7, 11, 13, 17, 19]; 
var theMaxNumber = 100; 
var theMinNumber = 21; 
var theCounter = 0; 

function myFunction() { 
    for (i = theMinNumber; i < theMaxNumber; i += 2) { 
     theCounter = 0; 
     for (m = 0; m < primeArr.length; m++) { 
      if (i % primeArr[m] !== 0) { 
       theCounter++; 
      } 
      if (theCounter === primeArr.length) { 
       primeArr.push(i); 
      } 
     } 
    } 
    primeArr.unshift(2); 
    console.log(primeArr.toString()); 
} 
+0

在紙上播放。只有在'i%primeArr [m] == 0'的時候做某件事纔有意義,因爲你已經找到了一個因素。 JavaScript是快速和良好學習的不幸選擇。也許主流的java會做。 _(意見)_ –

+0

您爲素數定義的數組已經只包含質數。你在這裏找到什麼?在這行代碼if(i% > primeArr [m]!== 0){ w ++; - >嘗試增加一個未聲明的變量。 –

+0

我不小心寫了_w_而不是_theCounter_,謝謝你的評論。我編寫了這行代碼,以便爲列表中的每個素數分配_i_。如果_i_中的任何一個都不能被整除(模數不爲0),則意味着它也是素數,並且它被添加到列表中。在第一個「for循環」中,從21到100的所有素數應該被添加到_primeArr_中。 –

回答

0

你停止條件是錯誤的內部for循環它有一個無限循環增加primeArr永遠,直到它崩潰JS引擎。 添加「警報」或「調試器」命令以查看問題

 for (m = 0; m < primeArr.length; m++) { 
      if (i % primeArr[m] !== 0) { 
       theCounter++; 
       if (theCounter === primeArr.length) { 
        primeArr.push(i); 
       } 
+1

哇,我沒想過!即使簡單地添加一個「break」不會使代碼起作用,至少現在很清楚它爲什麼崩潰!只要我有15個或更多的聲望,我就會高興起來(現在我不能) –