2014-02-21 24 views
1

剛開始學習java,我不明白我的代碼有什麼問題。 PrimeIterator應該生成素數的無限量(從3號開始),但是當我打印輸出獲得:3,5,7,9,11,13,15等標記爲「繼續」似乎不起作用

public class Prime { 

    PrimeIterator iter = new PrimeIterator(); 

    private class PrimeIterator implements java.util.Iterator<Integer> 
    { 
     int numb = 1; 

     public boolean hasNext() 
     { 
      return true; 
     } 

     public Integer next() 
     { 
      nextCandidate: 
      do{ 
       numb += 2; 
       int numbSqrt = (int)java.lang.Math.sqrt(numb); 

       for (int i = 3; i <= numbSqrt; i = i+2) 
       { 
        if (numb % i == 0) 
        { 
         continue nextCandidate; 
        } 
       } 
      }while(false); 
      return numb; 
     } 

     public void remove() {} 
    } 

    void printPrimes() 
    { 
     System.out.print(2); 
     while(iter.hasNext()) 
     { 
      try 
      { 
       Thread.sleep(500); 
      } catch (InterruptedException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      System.out.print(", " + iter.next()); 
     } 
    } 
} 

我想爲我的do-while循環使用帶標籤的「continue」語句。然而,我的直覺告訴我,我錯誤地使用它。

+2

你知道9和15是不是素數,對吧? –

+0

也許我錯過了它,但它看起來並不像你打印輸出 –

+1

而不是繼續我會建議打破。或者返回false – KRUKUSA

回答

1

問題在於while(false)延續條件。作爲do while(false)聲明,這意味着它永遠不會循環多次。也就是說,當您嘗試將執行跳轉到帶標籤的語句時,即使您認爲continue將再次執行循環,它也不會再次通過do while循環,因爲繼續條件(false)未驗證。

因此,它不會每next()方法執行增加numb一次以上。

我會做類似下面的東西:

nextCandidate: 
do{ 
    numb += 2; 
    int numbSqrt = (int)java.lang.Math.sqrt(numb); 

    for (int i = 3; i <= numbSqrt; i = i+2) 
    { 
     if (numb % i == 0) 
     { 
      continue nextCandidate; 
     } 
    } 
    break; 

}while(true); 
+0

謝謝,這解釋了我的問題! –

+0

好的。還請注意觀察@Sam我發佈了關於截斷'sqrt'(點3.在他的答案中)。 –

1

這裏是我看到

  1. 你甚至沒有打印輸出的問題。

  2. (int)java.lang.Math.sqrt(5)將最終截斷爲2。你應該在你的平方根上加1,因爲如果你的迭代次數不夠多,這是一個問題,但是如果迭代次數超過了你的需要,這就不成問題了。

  3. 當你找到一個素數,你for循環將結束,while(false)將終止do-while循環

+0

@AndreiNicusan你是對的。我擔心如果'我'是4,那麼會說4是素數,但是再一次,'我'永遠不會是'4' –

+0

我想把我的數字增加2,以便優化整個事情。我無法很好地在我的PrimeIterator子類中實現生成數字2。 –

+0

實際上,不是我想到的更多,平方根的事情不會實際上最終成爲一個問題 –