2017-09-04 84 views
0

我正在執行代碼以顯示從1到100的素數。當我執行下面的代碼時,它不顯示所有數字。這裏是代碼由於聲明不正確而導致輸出錯誤?

public class PrimeNumberSeries { 

    public static void main(String[] args) { 
     boolean flag = true; 
     for(int i=1; i <= 100; i++){ 
       for(int j=2; j<= i-1; j++){ 
        if(i%j==0){ 
        flag = false; 
        break; 
       } 
      } 
      if(flag == true){ 
       System.out.println("The number is prime number. Value = "+ i); 
      } 
     } 

    } 

} 

我很困惑關於標誌變量的聲明。該方案顯示我一個正確的輸出,如果我宣佈第一個for循環中的變量,也就是

for(int i=1; i <= 100; i++){ 
       boolean flag = true; 
        for(int j=2; j<= i-1; j++){ 

背後是什麼原因呢? 如果該變量被聲明爲主方法之上的類變量(static boolean flag),那麼它也顯示相同的輸出。

+1

不是聲明,但初始化是問題... –

回答

0

第二個是正確的。

問題在第一個版本是因爲有時flag尚未在循環中更改,因此使用初始化值。 用不同的方式說:對先前(或先前的一些)檢查有價值。

或者在僞代碼正確算法是:

for every number from 1 to 100 
    assume is prime 
    check, maybe have dividor -> not prime 
    print 
1

會發生什麼事是,聲明你boolean flag以外的循環時,它不被重置true每個Integer i。所以一旦boolean flag變爲false它將保持false之後每個Integer i。在循環中聲明它會確保它每次都重置爲true

+0

感謝您解釋它背後的編程邏輯。 –

3

正開始boolean flag = true;的for循環內爲i,確保了的j每個增量,再次flag分配值true。這就是正確實施,我們假定你是最初的數字:i是primeNumber,當你發現它的任何除數,你讓flag=false

+1

感謝您的簡潔和準確的解釋!它有很多幫助。 –

+0

我的快樂先生,如果您滿意並請回答問題,請接受答案。 –

0

你並不需要檢查Ĵ可貴Ĵ< = I-1

for(int j=2; j<= i-1; j++) 

你只需要直到Ĵ< = Math.sqrt(I)

以下是爲您的使用情況有點優化的解決方案。

int n=100; 
System.out.println("All Prime Numbers Between 1 to "+n); 
boolean isPrime; 

for (int i = 2; i <= n; i++) { 
    isPrime = true; 
    for (int j = 2; j <=Math.sqrt(i); j++) { 
     if (i % j == 0) { 
      isPrime = false; 
      break; 
     } 
    } 

    if (isPrime) 
     System.out.print(i + " "); 
} 
相關問題