2017-09-04 7 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

2番目は正しいです。

最初のバージョンでの問題は、ループ内でflagが変更されていないことがあるため、初期化値が使用されることがあります。 違う方法で言ってください:以前の(または以前の)チェックの値があります。

または擬似コード正しいアルゴリズムである:

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

boolean flagをループ外に宣言すると、Integer iごとにtrueにリセットされません。したがって、boolean flagfalseに変更されると、それ以降はそれぞれInteger iに対してfalseのままになります。ループの内側に宣言すると、毎回trueにリセットされます。

+0

その背後にあるプログラミングロジックを説明してくれてありがとうございます。 –

3

iためforLoop内部boolean flag = true;を初期化、jの各増分のために、再びflagtrueに値が割り当てられることを保証します。 I-1 = i primeNumberであり、あなたはそれのいずれかの除数を見つけたとき、あなたはflag=false

+1

簡潔で正確な説明をありがとう!それは多くの助けになります。 –

+0

私の喜びの先生、あなたが満足している場合は答えを受け入れ、質問を閉じる。 –

0

を作るあなたはJ <までのjの値をチェックする必要はありません。あなたが最初に番号があると仮定しているとしてそれは、正しい実装であるものです

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

あなたは自分のユースケースのために少し最適化されたソリューションです後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 + " "); 
} 
関連する問題