平成25年度 春期 応用情報技術者試験 午前 問7
配列 A に対して次の手続を実行して,2 ≦ k ≦ 100 である素数 k だけを全て出力したい。a,b,c に入るループの初期値,終値,増分として,適切な組合せはどれか。
for k = 2 to 100 step 1:
A[k] = 1;
for m = 2 to 10 step 1:
for k = [ a ] to [ b ] step [ c ]:
A[k] = 0;
for k = 2 to 100 step 1:
if A[k] ≠ 0:
print k;
| a | b | c | |
|---|---|---|---|
| ア | 2 | m² | 1 |
| イ | 2m | 100 | m |
| ウ | m | m² | m |
| エ | m² | 100 | 1 |
キーボード:1〜4 で解答 → 次の問題 ← 前の問題
正解と解説を見る
解答する前に解説を開いたので、この問題は「見て解いた」として記録します(正解数には入りません)。
正解:イ
この手続はエラトステネスのふるいです。まず A[2]~A[100] をすべて 1(素数候補)にし,m = 2~10 について m の倍数のうち m 自身を除くもの を 0(合成数)にします。
100 以下の合成数は必ず √100 = 10 以下の素因数をもつので,m を 10 まで調べれば十分です。m の倍数を消すには,初期値 2m,終値 100,増分 m とします。
-
ア: a = 2,b = m²,c = 1
誤り。2 から m² までのすべての k を 0 にするので,素数も消されてしまいます(m = 10 なら 2~100 がすべて 0 になります)。 -
イ: a = 2m,b = 100,c = m
正しい。m の倍数のうち m 自身を除く 2m,3m,… を 100 まで 0 にします。m = 2~10 で繰り返すと,100 以下の合成数はすべて 10 以下の素因数をもつので消され,素数だけが残ります(エラトステネスのふるい)。 -
ウ: a = m,b = m²,c = m
誤り。初期値が m なので,m = 2,3,5,7 のときに素数である m 自身まで 0 にしてしまいます。また m² までしか消さないので 100 以下の倍数を消し切れません。 -
エ: a = m²,b = 100,c = 1
誤り。m² 以上のすべての k を 0 にするので,例えば m = 2 のとき 4 以上の素数 5,7,… も消えてしまいます。
答え
イ: a = 2m,b = 100,c = m
出典:平成25年度 春期 応用情報技術者試験 午前 問7