public static void main(String[] args){
for(int testNumber=2;testNumber<=100;testNumber++){
boolean sosu=true;
for(int i=2;i<n;i++){
if(n%i==0)
sosu=false;
break;
}
if(sosu){ System.out.println(testNumber);
}
}
}
このコードにおける、
boolean sosu=true;
のところと、
sosu=false
のところがどういう働きをしているのかわからないのですが、どなたか教えていただけないでしょうか。
つまるところboolean型変数の意味がよくわかっていません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
Java
1boolean sosu=true;//素数である。 2for(int i=2;i<n;i++){ 3 if(n%i==0){//nはiで割り切れる。 4 sosu=false;//素数ではない。 5 break; 6 } 7}
コードにコメントを追記しました。
このコードは数字は「素数」、「素数ではない」かを調べるものですよね。このように特性が二つの値しかとらない時に使うのがbooleanです。
投稿2016/01/18 04:56
総合スコア18157
0
booleanは真(true)偽(false)の二つの状態を表す型名です。
提示されたプログラムは、素数を求めているようですが・・・このままでは動きません。
まずnがいません^^;
なので n= testNumber としてかんがえると、testNumber が2からnまでで割れるなら素数ではない!
最初はboolean sosu=true;で素数である・・・とする
if(n%i==0)nまでの数で割り切れたらsosu=false; 素数ではなかった!・・・でループを抜ける!
・・・としようとしているようですが・・・そうはなりません。
どこからかの引用であれば、間違いが無いか確認してください。
投稿2016/01/18 04:51
総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
boolean型は真偽を表す型です。
ifの条件分岐やforの継続条件などに使います。
ifの括弧に入れたbooleanがtrueならそのブロックを実行しますが、falseなら無視します。
また、何も変数に入れて使う必要はなく、貴方自身のコードでも変数を使わずbooleanを使っています。
java
1 for(int i=2;i<n;i++){ 2 if(n%i==0)
ここで使われている<
や==
などを「比較演算子」と呼ぶのですが、
この演算の結果がtrueかfalseのboolean型で返ってきます。
その結果次第で処理を行ったり行わなかったりするわけです。
さて、ここでboolean型の変数sosuが登場するポイントを見てみましょう。
java
1boolean sosu=true;
sosuが宣言され、trueで初期化されました。このまま何も起きなければsosuはtrueのままです。
java
1 for(int i=2;i<testNumber;i++){ 2 if(testNumber%i==0){ 3 sosu=false; 4 break; 5 } 6 }
(ifのブロックを加え、nをtestNumberに変えました。)
次にここです。
testNumberを2から順に試し割りしています。割り切れるものがあれば素数ではないので、sosuをfalseに変えてループを抜けます。
割り切れるものがなければsosuはtrueのままループを抜けます。
java
1 if(sosu){ 2 System.out.println(testNumber);
さてここでsosuがどっちなのかif文で見ています。
先ほどの過程で割り切れるものがあった場合にはsosuがfalseになっているため、testNumberは出力されません。
割り切れるものがなく、sosuがtrueのままここにたどり着ければ、晴れてtestNumberが出力されます。
投稿2016/01/18 14:20
総合スコア20675
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
コードを拝見したところ「変数n」の宣言が見当たらないので、もしかしたら間違っているかもしれませんが・・・
ソースをざっくり読むとこんな感じかなと思います。
for(2~n)の間にn%i==0に合致する整数が存在するか、否かを確認していて
・存在する → 何もしない
・存在しない→ System.out.println(testNumber)を実行
上記から、このコードの「sosu」は「for内でnがn%i==0に合致しないことを示すフラグ」であり、
sosu==ture ならば「n%i!=0」なので「System.out.println(testNumber)を実行
sosu==falseならば「n%i==0」なので、何もしない
ですかね。
投稿2016/01/18 05:09
総合スコア10
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
変数名や雰囲気を考えるに、素数求めるプログラム・・・・でしょうか。
この2つ目のfor文で登場する、「n」がわからないのですが・・・
for(int i=2;i<n;i++){
きっとこの処理以前のどこかに、
int n = testNumber
という処理を入れ忘れたものとして考えます。
boolean 型は、「真」か「偽」のシンプルな値を保持するための変数です。
最初のfor文ループの先頭の
java
1 for(int testNumber=2;testNumber<=100;testNumber++){ 2 3 boolean sosu=true;
ここで、sosuという変数をメモリに用意し、true(真)という値を同時に与えています。
「先ず一旦、素数ということにしておく」わけですね。
次に、
java
1 for(int i=2;i<n;i++){ 2 if(n%i==0) 3 sosu=false; 4 break; 5 }
では、もしも n%i の剰余が0だったら・・・nがiで割り切れるならば、sosuをfalse に設定しなおしてます。
変数iは、2~n-1まで増加していきますから、ここの処理を要約すると
「Nより小さい整数の少なくとも1つでNが割り切れるならば、N素数ではない」
と言えます。
このforループを抜けた後、もしも素数であった場合は、その数を結果を表示してますね。
java
1 if(sosu){ 2 System.out.println(testNumber); 3 }
素数判定のアルゴリズムとしては、ちょっと冗長になります。
同様のアルゴリズムでは、「エラトステネスの篩」などが有名で、しかも簡単です。
boolean という変数の型が無い場合は、int型などで、真を「1」偽を「0」と対応させればよいのですが、
この変数はint型のため、-2とか5000とかも許容してしまうのが問題ですね。
大規模な開発で、変数の仕様がプログラマに共有しずらく、ついつい他の値を入れてしまって、バグがでてしまったり、安易に「2」の場合はこう、「-1」の場合はこういう処理にする、みたいに区分値を増やされて複雑化してしまったりしてしまいます。
投稿2016/01/18 05:00
総合スコア422
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「真」と「偽」です。trueが真でfalseが偽です。
if文は条件式が真の場合実行します。ネストしてあるfor文で、1とその数以外で割り切れるか調べています。割り切れる数があれば、その数は素数ではない、ということになるので、sosuをfalseとし、if文は実行しません。
しかし変数nがどこにも宣言されていないので、このままではコンパイルエラーになります。
投稿2016/01/18 04:52

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。