職業訓練8日目 [勉強]
今日(07/29)は、while文、do-while文、break、continueのお勉強でした。
講師が出すお題をゴリゴリコーディングして、javacコマンドでコンパイルして・・・ってみんながやっている中、先に済んでしまった私は昨日(07/28)からひっかかっていた素数リスト表示プログラムで、一人てんやわんや してました。
キーワードで java 素数 判定とか、java 素数 表示などで検索すると、たいてい配列使ったソースに辿り着くんですよね。
・・・職業訓練では、まだ配列習ってないから、for文を二重にして、力業で実現するしかないんです。
そこで、あれこれ検索して、あちこち参考にして・・・・・・なんとか、素数リスト表示プログラムができましたよ。
そもそも、素数なんて何年ぶりに聞いたんだろ・・・・・・。(^-^;
素数とは・・・
「1とその数自身以外に正の約数がない(1とその数以外のどんな自然数によっても割り切れない)、1より大きい自然数のこと。」by Wikipedia
ややこしいな、この表現。
要するに「1より大きい自然数=2」だよね。次、3は3でしか割り切れないから素数だよね。4は2で割り切れるから素数じゃないね。って感じで求めるのかな。なんか素因数分解とか思い出したような、思い出さないような。
以下、クラスPrimeNumberで、2~1,000の中にある素数をリスト表示するソースです。
//課題「2~1,000の素数を全て表示する」プログラム
public class PrimeNumber {
public static void main(String args[]) {
int i,j;
int cnt = 0; //カウント用変数
for(i = 2; i <= 1000; i++) {
for(j = 2; j < i; j++) {
if(i % j == 0) { //2~1000を2~1000(もしかすると999?)で割って割り切れた場合
break; //forのループ1こ抜けて、最初のfor文に行く
}
}
if(i == j){
System.out.print(i + " "); //素数の表示
cnt++; //カウントUP
if (cnt % 10 == 0) { //素数を10個表示したら改行
System.out.println("");
}
}
}
System.out.println("");
System.out.println("end");
}
}
こんな感じで、なんとか2~1000までの素数を10個ずつ表示して改行してって感じになりました。
「10個表示した後に改行」っていうのは、改行しないと素数のリストが見づらかったからです。
このソースを講師に見せたら「かなりの力業ですねぇ~」って言われました。(^-^;
だって、for文とif文しか習っていない状態(while文とか配列とかまだ習っていない)だと、こんな感じだと思うんですけどねぇ。
もっとスマートな方法があるのかなぁ?
blooean型変数とか使ってtrue/falseで素数か否かの判定をした方が見やすかったりするのかな?
ま、いいや。
とりあえず思った通りの動作をしてくれたし。
たぶん、上記プログラムに手を加えれば、入力された数値までの素数をリスト表示するとかも実現できるんでしょうね。
その場合、import java.io.*;とか、
BufferedReader = kbd BufferedReader(new InputStreamReader(System.in));とか、
String line = kbd.readLine();とか
int n = Integer.parsInt(line);とか
追記して、最初のfor文の条件式「i <= 1000」の部分を「i <= n」に変更したりして・・・
あ、できそうだねぇ。
でもあまり大きな数値を入力されても困るよねぇ。
コマンドライン引数で入力された数値までの素数をリスト表示することも、できるな。
入力された数値が含む素数をリスト表示するだけではなく、入力された数値が素数か否かの判定とか、入力された数値がいくつ素数を含むのか結果だけ表示したりとか、いろいろできそうですね。
とりあえず・・・・・・
素数は、もうイイや。(^-^;
明日(07/30)からはメソッドだったかなぁ。COBOL開発経験者とかはオブジェクト指向につまづくらしいけど、私はVBとかC経験(しかも独学で実務経験なし)しかないから、大丈夫かなぁ。
きっと。たぶん。おそらく。
コメント 0