2015-09-25 275 views
-1

我需要編寫一個代碼來計算前200個素數,但只要我無法解釋一切。我用一段代碼作爲參考(http://crab.rutgers.edu/~dhong/cs325/chapter3/PrimeNumber.java)。我有一個計算前200個素數的程序,但我不明白其中的公式

所有代碼:

public class Opdracht3 { 
    public static void main(String[] args) { 
     int limiet = 200; 
     int counter = 1; 
     int testpriem = 3; 
     boolean isPriem; 

     while (counter <= limiet) { 
      isPriem = true; 
      for (int i = 2; i <= testpriem/2; i++) { 
       if (testpriem % i == 0) { 
        isPriem = false; 
        break; 
       } 
      } 
      if (isPriem) { 
       System.out.println(counter + ": " + testpriem); 
       counter++; 
      } 
      testpriem++; 
     } 
    } 
} 

下面的代碼部分驗證如果數量是複合。如果testpriem是合成的,則會從循環中出來並重新開始。否則,它將繼續並打印質數testpriem

的問題是在這裏:

for (int i = 2; i <= testpriem/2; i++) { 
    if (testpriem % i == 0) { 
     isPriem = false; 
     break; 
    } 
} 

我測試會發生什麼我,並拉上它認識到計算合成所需的因子。 (有4個除數是2,有9個除數是3,有221個除數是13)但是我爲什麼大驚小怪。

有什麼想法?

+0

不是答案,而是旁白:在您的代碼中,「prime」作爲「priem」存在拼寫錯誤。我建議修復它們。 –

+1

@EdCottrell他們不是拼寫錯誤,OP是荷蘭人。素數是我們語言中的「priemgetallen」;)。 OP:素數的定義是它只能被自身除或1。 – nbokmans

+0

...並且必須大於1。 – Stefan

回答

0

首先記住每個數字可以除以一半或更少。考慮數字7有可能除以1,2,3,因爲3以後,如果嘗試用4除數意味着4x2 = 8大於7,所以這是找到除數的最佳方式。每個數字除以1和數字還有一件事。因此,如果數數除以1或本身然後它被稱爲黃金,所以我從2

現在開始考慮testpriem = 7,所以你會得到像

for (int i = 2; i <= 7/2(i.e 3); i++) 
    { 
      if(7 % i == 0) 
      { 
       isPriem = false; 
       break; 
      } 

所以第一次循環會檢查7% 2 = 1,因此條件爲false。再次檢查7%3 = 1再次條件錯誤。現在這個條件滿這裏填充我< = 7/2(即,3個),因此循環停止,並且它導致7數是素數

+0

好了,所以它在做什麼,它測試全部是自然數(我想用我++)的除數,並保持這樣做,直到7%模i等於零?如果是這樣的話,我想我明白髮生了什麼。謝謝! – TheGravyNator

+0

就是這樣。 – Asoub

+0

偉大的,我有我的答案。非常感謝你!!!! – TheGravyNator

1

Java中的% or ("remainder") operator將一個操作數除以另一個操作數,並返回餘數作爲其結果。當然,如果整數x可以被另一個整數y(意思是x/y =某些整數z,其餘爲零)整除,那麼x不能爲素數。

+0

感謝評論!我知道%運算符是如何工作的,以及爲什麼它可以計算出數字是否爲素數。但我的問題是,代碼找到了數字的除數,我無法弄清楚如何。 – TheGravyNator

+0

啊,我明白了。然後我不確定你確切的問題是什麼,對不起。你知道如果'testpriem%i == 0',那麼你已經找到一個除數,並且循環中斷。那不是你尋找的「爲什麼」? –

+0

沒問題。我現在有我的答案,問題是我沒有完全理解for循環的作用。 (測試,當假的,移動到下一個數字) – TheGravyNator

0

斷裂停止for循環,並移動到在while循環的下一個位置。所以它不會重新啓動當前測試號碼的for循環。

該中斷用於效率原因。你可以刪除它,算法仍然可以正常工作,但速度較慢。

+0

感謝評論!這當然有助於瞭解到底發生了什麼! – TheGravyNator

相關問題