今回は以下のプログラムの書き方を解説していきます。
1 以上の整数を一つ入力し,その整数以下の素数をすべて求めて画面表示するプログラムを作成せよ
「素数」にはどういったアルゴリズムがあるのか考えることが必要になってきます。
サンプルコードと実行結果
1 以上の整数を一つ入力し,その整数以下の素数をすべて求めて画面表示するプログラムを作成せよ
サンプルコード
コードは以下の通り (/**/で囲まれた部分は説明文のためコードではないです)
#include <stdio.h>
int main(){
/*整数型変数を定義*/
int a,b,c,d;
/*aの数値をキーボードから代入*/
printf("自然数を入力:");
scanf("%d",&a);
/*ループの前にbの初期値を1にする*/
b=1;
while(b<a){
/*bを1ループにつき1ずつ増やしていく*/
b++;
/*次のループの前に毎回cの値を1にリセット*/
/*次のループの前に毎回dの値を0にリセット*/
c=1;
d=0;
while(c<b){
c++;
/*自身の数以外で割れてしまったら素数ではない*/
/*この時dの値を増やす*/
/*「%」は余りを求め演算子*/
if(b%c==0 && b!=c){
d++;
break;
}
}
/*dが増えなかったときのみ素数と言える*/
if(d==0){
printf("素数表示:%d\n",b);
}
}
return 0;
}
実行結果
実行結果は以下の通り
自然数を入力:13
素数表示:2
素数表示:3
素数表示:5
素数表示:7
素数表示:11
素数表示:13
サンプルコードの挙動
今回紹介したソースコードでは、変数を4つも使用しておりとても分かりにくいと思います。
まず大まかな流れとして
- 基準(上限)の整数をaに格納
- b(初期値b=2)で、2から順に素数判定をしていき、判定後毎回+1していく
- bがaと同じ値になったら終了
このようにして入力した整数以下の素数をすべて求めていきます。
例えばa=13とします。
b=1を初期値とし、ループ初めに毎回+1して増やしていきます
- b=2素数判定➝素数
- b=3素数判定➝素数
:
: - b=11素数判定➝素数
- b=12素数判定
- b=13素数判定➝素数 (a=bのためここで終了)
/*ループの前にbの初期値を1にする*/
b=1;
while(b<a){
/*bを1ループにつき1ずつ増やしていく*/
b++;
/*次のループの前に毎回cの値を1にリセット*/
/*次のループの前に毎回dの値を0にリセット*/
c=1;
d=0;
while(c<b){
c++;
/*自身の数以外で割れてしまったら素数ではない*/
/*この時dの値を増やす*/
/*「%」は余りを求め演算子*/
if(b%c==0 && b!=c){
d++;
break;
}
}
/*dが増えなかったときのみ素数と言える*/
if(d==0){
printf("素数表示:%d\n",b);
}
}
bの素数判定の仕方は、cとdを用いて行います。
コードでは2つ目のwhile文です。
例えばb=5のとき
whileループでcを毎回+1していき、b÷cで素数判定をします。
- b÷c
- 5÷2➝割り切れない
- 5÷3➝割り切れない
- 5÷4➝割り切れない
- 5÷5(b=c)
bが自身と同じ数でしか割れない場合素数であるといえます。よってb=5は素数なので表示します。
例えばb=6のとき
- 6÷2→割り切れる&6≠2➝dを+1
bが自身以外の数で割れてしまった場合はdを+1します。
つまり素数のときのみd=0のままでいられるということです。
そして画面表示で
「d=0の時のみ表示」とすることで素数以外の数字を表示しないようにできます。
if(d==0){
printf("素数表示:%d\n",b);
}
このようにして素数判定を行います。
aまでの全ての数を調べるために、bで1つずつ確認していき、そのbの素数判定をするためにcとdを用いる、といった構造になります。
おすすめ参考書紹介
「苦しんで覚えるC言語」はひとつひとつの要素をスローモーションでゆっくり確実に解説していることが特徴です。真面目にC言語を覚えたい初心者向けで、コツコツと確実に力をつけていくことができます。
「スッキリわかるC言語入門 第2版 (スッキリわかる入門シリーズ)」は「苦しんで覚えるC言語」に比べより親しみやすいイラストや構成で苦手意識を持ちにくい工夫が施されています。
コメント