2013-02-24 24 views
2

我想讓這個Java程序流10001質數,但它莫名其妙地決定將16作爲素數標記。Java - 素數算法返回16

這裏的算法只是保持素數的運行計數,並檢查每個新的數字,看看它是否可以被小於它的任何素數整除。如果不是,則將其添加到數組primes []中,號碼顯示在控制檯上,並且過程繼續,直到primes[ ]已滿。

public static void main(String[] args){ 
    int[] primes = new int[10001]; 
    int primeCount = 1; 
    int testNumber = 3; 
    primes[0] = 2; 
    while(primeCount < 10001){ 
     for (int i = 0; i < primeCount; i++){ 
      if (testNumber % primes[i] == 0){ 
       i = 0; 
       testNumber++; 
      } 
     } 
     primes[primeCount] = testNumber; 
     System.out.println(testNumber); 
     primeCount++; 
     testNumber++; 

    } 
} 

控制檯讀取:

 
3 
5 
7 
11 
13 
16 
17 
19 
. 
. 
. 

其他的一切看起來是爲了除16 ...任何想法?

+0

你在檢查16對2嗎?它看起來像你的代碼不檢查2(素數)。 – 2013-02-24 21:18:49

+4

有沒有聽說過Eratosthenes的篩子?爲什麼要組成一個新的,不正確的算法? http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes – duffymo 2013-02-24 21:19:42

+0

這是功課嗎? – krico 2013-02-24 21:23:50

回答

6

您應該設置i = -1而不是i = 0,因爲您在將其設置爲零後立即將其值增加爲i

我建議你用for循環的工作原理來清醒一下。

+0

斑點... – vikingsteve 2013-02-24 21:26:30

0

這裏是你的程序

public static void main(String [] args){ 

     int[] primes = new int[10001]; 
     int primeCount = 1; 
     int testNumber = 3; 
     primes[0] = 2; 
     while(primeCount < 10001){ 
      for (int i = 0; i < primeCount; i++){ 

       if (testNumber % primes[i] == 0){ 
        i = -1; 
        testNumber++; 
       } 
      } 
      primes[primeCount] = testNumber; 
      System.out.println(testNumber); 
      primeCount++; 
      testNumber++; 

     } 
    } 
4

的固定版本對於軟件編程的角度看,你不應該使用該while循環中循環。你應該循環,直到如果你發現它不是素數,或者你檢查所有的可能性,並認爲它是你的主要因素找不到任何分頻器。所以你應該在較大的時間內有一個while循環。我的意思是:

public static void main(String[] args) { 
    int[] primes = new int[10001]; 
    int primeCount = 1; 
    int testNumber = 3; 
    primes[0] = 2; 
    while (primeCount < 10001) { 
     boolean isPrime = true; 
     int i = 0; 
     while (isPrime && i < primeCount) { 
      if (testNumber % primes[i] == 0) { 
       i = 0; 
       testNumber++; 
       isPrime = false; 
      } else { 
       i++; 
      } 
     } 
     if (isPrime) { 
      primes[primeCount] = testNumber; 
      System.out.println(testNumber); 
      primeCount++; 
      testNumber++; 
     } 

    } 
}