★基本制御文(whileおまけ)★
whileについては一区切りするつもりでしたが、繰り返しの概念は後々もずっと重要な考え方ですので、もっと慣れてもらうために「おまけ」を付けておきます。
以前、素数のことを書きましたが、入力した値が素数かどうか調べるプログラムを作ってみましょう。
素数とは、1かその数自身でしか割り切れない数です。
「2」「3」「5」「7」「11」等は素数です。
「4」「6」「9」「10」等は素数ではなく「合成数」と言います。
「4」は1と4以外に「2」で割り切れます。
「6」は1と6以外に「2」「3」で割り切れます。
「9」は1と9以外に「3」で割り切れます。
「10」は1と10以外に「2」「5」で割り切れます。
では、2以上の整数を入力して素数かどうか調べるにはどのように考えれば良いでしょうか。
どの数も1で割り切れるのは分かっていますから、入力した数以外で割り切れる数があるかどうかが鍵になります。
闇雲に調べることはコンピュータにとっては難しいことですから、2から始めて順番に割り切れるかどうか調べていきます。
つまり、ある整数が入力されたら、
「2」で割り切れるか?
「3」で割り切れるか?
「4」で割り切れるか?
「5」で割り切れるか?
「6」で割り切れるか?
・
・
・
「入力した数」で割り切れるか?
を順番に「繰り返し」チェックしていきます。
いつか絶対に割り切るはずですが、割り切れた時点で繰り返しは終了します。
あとは、入力した値そのもので割り切れたのか、それ以外の数値で割り切れたのかをチェックすれば素数かどうか分かります。
説明はここまでです。
早速作ってみてください。
<実行結果1 VC++ Express Edition>
2以上の整数を入力してください:1
2以上の整数を入力してください:5
入力された値は素数です。
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
2以上の整数を入力してください:4
入力された値は素数ではありません。
続行するには何かキーを押してください・・・
解答例です。
<sample program 050-01>
#include <stdio.h>
int main( void )
{
int counter;
int input;
counter = 2;
do {
printf( "2以上の整数を入力してください:" );
scanf( "%d", &input );
} while( input < 2 );
while( input > counter ) {
if( input % counter == 0 ) {
break;
}
counter++;
}
if( input == counter ) {
printf( "入力された値は素数です。\n" );
}
else {
printf( "入力された値は素数ではありません。\n" );
}
return 0;
}
|
<実行結果 VC++ Express Edition>
2以上の整数を入力してください:18
入力された値は素数ではありません。
続行するには何かキーを押してください・・・
ポイントは、以下の部分です。
while( input > counter ) { if( input % counter == 0 ) { break; } counter++; }
割り切れたかどうかを調べるには、割った余りを調べればよいですね。
割った余りが「0」であれば割り切れたということです。
入力した値「input」を2から順番に数えるカウンタ「counter」で割った余りを求めています。
割った余りが「0」になれば、割り切れたと言うことですから、繰り返しからbreakします。
さて、これで「おまけ」は終わりです。
もっと何か作ってみたいと思う方は、ネット上で「フィボナッチ数列」の説明を読んで、自分で作ってみてください。