2016-10-16 5 views
0

要約:物事を行う別の方法を習得しようとしている。私が少なくとも理解しているJavaの部分は、それぞれのコードが互いにどのように通信するかです。そのため、従来のisPrime forループ生成でメソッド呼び出しを使用する代わりに、ネストされたループのみを使用してメソッド呼び出しを試みています。しかし、私が得た最も近いものは、2を100まで増やすことです。それが素数であるかどうかはチェックしていません。私はサンプルコードを提供していますが、私のコードが意図したとおりに動作しない理由がわかりません。可能であれば、私のコードサンプルを修正し、修正内容を説明してください。ネストされたforループを使用して、数字がプライムであるかどうかをチェックします。そうであれば、それらをセットに追加する - isPrimeのメソッドを使わずに

私が何をしようとしている:すべての素数2を追加 - (2が開始する前に追加されました)セットに> 100を

予想:2、3、5、7、11、13、 17,19,23,29,31 ... 実際:... 5,7,9,11,13,15,17 ...(+ = 2、99まで)

なぜですかこのコードは、指定した条件を使用する代わりに、2だけカウントします。

私のロジックは次のとおりです。

  1. はすべて(設定するには、2を追加し、ものを作る)
  2. 条件addNumber準備 - trueの場合、セットにそれを追加し、そうでない場合は、次の 番号に移動します
  3. 外側ループ - n - は、テストされる番号です。 3で始まり、 が2だけ増分されます(偶数は素数ではありません)、最大100まで
  4. 内側ループ - i - "i - > n"の範囲は、プライムのチェックに使用されます。 nは私で割り切れる であれば数は、n個の%のI == 0に違反することが条件に違反が判明した場合、ベクター
  5. に追加することが分かっていなかった場合、数が出るの内側、
  6. プライムではありませんループして次の番号に移動します。

なぜ分かりませんか。私が意図したとおりに動作していません。 何故か休憩がうまくいかなくても、終了条件を指定しても動作しないのは分かりません。 私の小切手に決して届かず、2つの数字を追加するだけの理由が分かりません...

私は試したことがあります。入れ子になったループの一部の内側と外側に物を移動しました。

私はしましたそれが2でカウントするために私が起こる持って取得することができますすべてがある、またはそれは7まで追加し、それは(9)

研究を追加してはならない最初の値で停止します行わ:

Breaking out of nested loops in Java

Why do we check up to the square root of a prime number to determine if it is prime?

Prime Number Generator Logic

理想的な答えはbのだろう私のコードと説明を修正したサンプルコード。私はisPrimeメソッドを使用せずにこれを実行しようとしていますが、そのメソッドのロジックは数値を追加するループ内になければなりません。

public static void main(String[] args) { 
    boolean addNumber = true; 
    for (int n = 3; n < 100; n = n+2) { //outer loop -- argument 
     for(int i=2; i< n; i++){ //check if 2-->n is a divisor 
      if (n % i == 0){ //if it's NOT prime 
       addNumber = false; //set condition to FALSE 
       i=n+1; //ensure that inner loop break condition is met 
       break; //literally tell it to break 
      } 
      else { 
       i=n+1; 
       break; //if the above is not met, ensure that the inner loop is broken 
      } 

     }//closes inner loop 

     //before exiting loop, add the confirmed prime number to set 
     if(addNumber) //if we should add it 
      A.append(n); //add it 
    }//closes outer loop 

    System.out.println(A); 
} 

EDIT:「break;」を使用しています。ここでは効率の問題のみです。 nが素数ではないと判断すると、残りのすべてのi値を引き続き実行するのはなぜですか?私はこの話題を持ち続け、breakを使うことが実際に必要なシナリオを思いついた。

考えてみましょう:2と100の間の素数をセットに追加する代わりに、最初の25個の素数をセットに追加したいとしましょう。

外部ループを「安全」なものに変更する必要があります(正確ではありませんが、この例の場合)。n = 1000としましょう。このようにして、素数が不足することはありません追加されました。間違いなく2と1000の間に25の素数があります。

for (int n = 3; n < 1000; n++) { 
    addNumber = true; 
    .... 

今私たちは実際にブレークを使用する必要があります! (@ Nani2015によって)下正しいコードサンプルに外部ループを終了する前に、我々は追加する必要があります

if(A.size() == 25) 
    break; //break out of outer loop -- we have the desired number of elements 

これが作業しているセットは、Aは、我々が望む要素の量を持っているか否かをチェック。 FALSEの場合は何も行いません。もし真なら:中断する(完了しました)

これは物事を明確にします。私の元の質問では、ブレークを使用しては完全に不要でした。私がしなければならなかったのは、の両方を取り除いて、のブレークとなり、私のコードは意図した通りに動作していたはずです。しかし、誤った領域に改行を入力すると問題が発生しました。 "ブレーク;"の終了条件が満たされる前にループを終了したい場合、または終了する必要がある場合に使用してください。

+0

として成立している、あなたは内側のループから抜け出す条件に関係なく、次のコードを使用してください - これ、あなたは実際に私 – MordechayS

+0

からn ...から反復していないことを指摘いただきありがとうございます。私は第二の "休憩"を入れようとしました。いくつかの異なる場所で、しかし役に立たない。あなたのコメントは100%正しいですが、私の実際の問題は一般的に2つの休憩を取っていたことが判明しました。言うまでもなく、休憩はここでは効率の問題でしかないようである。受け入れられた答えはまた、可能な効率の改善にも取り組んだ。また、質問の書式設定を支援するために@BFRFRZに感謝します。私は自分自身でそのプロセスを開始できましたか?私のコメントは私のコメントを編集することができない理由です(私のコメントは受け入れられた回答への回答を参照してください)? – coder

+0

別の課題はありますか?私が前に言ったように、あなたは何も学んでいないでしょう、あなたはこのリソースを間違って使っています。あなたは教師に尋ねることを恐れていると言いました。そうではありません。彼らはあなたを助けるためにそこにいます。 – wordsmith

答えて

1

EclipseなどのIDEを使用することをお勧めします。デッドコードがある場合は表示されます。あなたの場合、内部ループのi ++はあなたがi = n + 1をやっているときにはデッドコードです。私は最初の繰り返しの後に常にnより大きい。 は参照

public static void main(String[] args) { 
    HashSet<Integer> A = new HashSet<>(); 
    A.add(2); 
    boolean addNumber; 
    for (int n = 3; n < 100; n++) { 
     addNumber = true; 
     for (int i = 2; i <= n/2; i++) { 
      if (n % i == 0) { 
       addNumber = false; 
       break; 
      } 
     } 
     if (addNumber) 
      A.add(n); 
    } 
    System.out.println(A); 
} 
+0

ありがとうございました!これはまさに私が探していたものであり、完璧な意味を持っています。論理についてのパラグラフを読むのとは対照的に、コードを見てそれを常に考えていくことは、私にとってはより効果的なようです。 「breakコマンドは___を実行します。 – coder

+0

(何らかの理由で、私は5分のウィンドウ内で私の前のコメントを編集できませんでした)私は編集ボタンや鉛筆アイコンなど何も見ませんでしたか?(ダブルポストは申し訳ありません) – coder

+0

^もう一度やりました。 ..司会者はこれを是正してください? とにかく、私は言うことをしてきました:私はあなたの答えを受け入れられたとマークし、それを上書きしました。あなたの迅速で分かりやすい返信をありがとう! – coder

関連する問題