要約:物事を行う別の方法を習得しようとしている。私が少なくとも理解している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だけカウントします。
私のロジックは次のとおりです。
- はすべて(設定するには、2を追加し、ものを作る)
- 条件addNumber準備 - trueの場合、セットにそれを追加し、そうでない場合は、次の 番号に移動します
- 外側ループ - n - は、テストされる番号です。 3で始まり、 が2だけ増分されます(偶数は素数ではありません)、最大100まで
- 内側ループ - i - "i - > n"の範囲は、プライムのチェックに使用されます。 nは私で割り切れる であれば数は、n個の%のI == 0に違反することが条件に違反が判明した場合、ベクター
- に追加することが分かっていなかった場合、数が出るの内側、
- プライムではありませんループして次の番号に移動します。
なぜ分かりませんか。私が意図したとおりに動作していません。 何故か休憩がうまくいかなくても、終了条件を指定しても動作しないのは分かりません。 私の小切手に決して届かず、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?
理想的な答えは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の場合は何も行いません。もし真なら:中断する(完了しました)
これは物事を明確にします。私の元の質問では、ブレークを使用しては完全に不要でした。私がしなければならなかったのは、の両方を取り除いて、のブレークとなり、私のコードは意図した通りに動作していたはずです。しかし、誤った領域に改行を入力すると問題が発生しました。 "ブレーク;"の終了条件が満たされる前にループを終了したい場合、または終了する必要がある場合に使用してください。
として成立している、あなたは内側のループから抜け出す条件に関係なく、次のコードを使用してください - これ、あなたは実際に私 – MordechayS
からn ...から反復していないことを指摘いただきありがとうございます。私は第二の "休憩"を入れようとしました。いくつかの異なる場所で、しかし役に立たない。あなたのコメントは100%正しいですが、私の実際の問題は一般的に2つの休憩を取っていたことが判明しました。言うまでもなく、休憩はここでは効率の問題でしかないようである。受け入れられた答えはまた、可能な効率の改善にも取り組んだ。また、質問の書式設定を支援するために@BFRFRZに感謝します。私は自分自身でそのプロセスを開始できましたか?私のコメントは私のコメントを編集することができない理由です(私のコメントは受け入れられた回答への回答を参照してください)? – coder
別の課題はありますか?私が前に言ったように、あなたは何も学んでいないでしょう、あなたはこのリソースを間違って使っています。あなたは教師に尋ねることを恐れていると言いました。そうではありません。彼らはあなたを助けるためにそこにいます。 – wordsmith