2016-11-17 23 views
3

我試圖做一個while循環遍歷每個可能的長數,並將它遇到的每個素數添加到素數組中。由於while循環應該運行直到素數的長度爲200,我期望primes數組填充前200個素數。相反,我得到全零。我已經成功地獲得了20行,每行10個字符,它們之間有一個空格。我怎麼能讓他們成爲實際的素數呢?如何用while循環分配數組值?

public class PrimeGenerator { 

    public static void main(String[] args) { 

     long primes[] = new long[200]; 

     while (primes.length > 200){ 

      for(long y = 2; y < Long.MAX_VALUE; y++) { 
       int primeCounter = 0; 

       if (isPrime(y) == true){ 
        primes[primeCounter] = y; 
        primeCounter++; 
       } 
      } 


     } 

     for (int i = 0; i < 20; i++) { 

      int primeCounter = 0; 

      for(int p = 0; p < 10; p++) { 
       System.out.print(primes[primeCounter] + " "); 
       primeCounter++; 
      } 

      System.out.println(); 
     } 
    } 


    public static boolean isPrime(long number) { 

     if (number % 2 == 0) 
      return false; 
     if (number == 2) 
      return true; 

     for(int x = 3; x*x <= number; x+=2) { 
      if (number%x == 0) 
       return false; 

     } 

     return true; 


    } 

} 
+0

我仍然得到全零。 –

+0

@ScaryWombat這也無濟於事,因爲'primes.length'保持不變(200)。 – Eran

回答

1

primes.length始終是200所以while循環從來沒有進入。

while循環沒用。只需在for循環中添加一個條件,當整個數組被分配後,該循環就會退出。同時將primeCounter的初始化移動到for循環之外。否則,所有素數將被分配到primes[0]

long primes[] = new long[200]; 
int primeCounter = 0; 
for(long y = 2; y < Long.MAX_VALUE && primeCounter < 200; y++) { 
    if (isPrime(y) == true){ 
     primes[primeCounter] = y; 
     primeCounter++; 
    } 
} 
for (int i = 0; i < primes.length; i++) { 
    System.out.print(primes[i]); 
    if ((i+1) % 10 == 0) 
     System.out.println(); 
} 

編輯:

由於掃地評論,你也應該解決您的isPrime的方法,因爲它返回false2

public static boolean isPrime(long number) { 
    if (number == 2) 
     return true; 
    if (number % 2 == 0) 
     return false; 

    for(int x = 3; x*x <= number; x+=2) { 
     if (number%x == 0) 
      return false; 
    } 
    return true; 
} 
+0

雖然這並不打印'2'。 OP的'isPrime'也是錯誤的。 – Sweeper

+0

@Sweeper我沒有看到'isPrime()'。我認爲這是正確的。謝謝! – Eran

+0

指的是前10000個素數,她希望我得到的第一個200時,教授給了我這個鏈接: http://primes.utm.edu/lists/small/10000.txt 它顯示爲2其中一個素數,所以我將方法設置爲接受2作爲素數以滿足分配要求。 –

0

這個代碼下來

long primes[] = new long[200]; 

    while (primes.length > 200){ 

手段

while (200 > 200){ 

或相同

while (false){ 

所以你的循環從不執行!

0

,因爲你做的事:

while (primes.length > 200) 

和數組的長度始終是200,你永遠也進不了while循環,以及陣列中的零來了,因爲當你創建數組「長」它用零初始化他

0

首先,數組的長度不變。所以,當你測試primes.length > 200時,這將永遠是錯誤的,並且甚至從未輸入循環。因此,數組中的所有值都保留默認值0

這樣做我會做一些這樣的:

int primeCounter = 0; 
long current = 0L; 
while(primeCounter < primes.length){ 
    if(isPrime(current)){ 
     primes[primeCounter] = current; 
     primeCounter++; 
    } 
    current++; 
} 
0

數組的長度不會改變。如果你聲明一個長度爲200的數組,它將總是有200的長度。因此,你的while循環永遠不會執行,甚至不會執行一次。

有很多代碼中的其他錯誤的,所以我試圖創建以儘可能少的變化可能的解決方案:

public static void main(String[] args) { 

    int primeCounter = 0; 
    long nextPossiblePrime = 2; 
    long primes[] = new long[200]; 

    while (primeCounter < 200) { 

     for (long y = nextPossiblePrime; y < Long.MAX_VALUE; y++) { 

      if (isPrime(y) == true) { 
       primes[primeCounter] = y; 
       primeCounter++; 
       nextPossiblePrime = y + 1; 
       break; 
      } 
     } 


    } 

    primeCounter = 0; 
    for (int i = 0; i < 20; i++) { 

     for (int p = 0; p < 10; p++) { 
      System.out.print(primes[primeCounter] + " "); 
      primeCounter++; 
     } 

     System.out.println(); 
    } 
} 


public static boolean isPrime(long number) { 
    if (number == 2 || number == 3) 
     return true; 

    if (number % 2 == 0) 
     return false; 


    for (int x = 3; x * x <= number; x += 2) { 
     if (number % x == 0) 
      return false; 

    } 

    return true; 


} 

第一個問題是,您創建了兩個primeCounter s,這是不需要。我刪除了額外的一個,並將其範圍移至該方法的範圍。接下來的問題是你的第一個for循環不記得它所在的素數,它在找到一個素數時不會停止,所以它會繼續向數組添加第200個素數。我通過添加一個nextPossiblePrime變量來解決這個問題,該變量存儲了程序接下來要檢查的數字。最後一個問題是您的isPrime方法寫入不正確。我爲你修好了!

下面是另一個(清潔劑)解決方案,它依然採用了while循環:

public static void main(String[] args) { 
    ArrayList<Long> primes = new ArrayList<>(); 
    long y = 2; 
    while (y < Long.MAX_VALUE && primes.size() < 200) { 
     if (isPrime(y) == true){ 
      primes.add(y); 
     } 
     y++; 
    } 
    for (int i = 0; i < primes.size(); i++) { 
     System.out.print(primes.get(i) + " "); 
     if ((i+1) % 10 == 0) 
      System.out.println(); 
    } 
} 


public static boolean isPrime(long number) { 
    if (number == 2 || number == 3) 
     return true; 

    if (number % 2 == 0) 
     return false; 


    for (int x = 3; x * x <= number; x += 2) { 
     if (number % x == 0) 
      return false; 

    } 

    return true; 


}