配列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 │ m2 │ 1 │
├─┼───┼───┼───┤
│イ│ 2m │100│ m │
├─┼───┼───┼───┤
│ウ│ m │ m2 │ m │
├─┼───┼───┼───┤
│エ│ m2 │100│ 1 │
└─┴───┴───┴───┘
イ
for k = 2 to 100 step 1:
A[k] = 1;
は配列Aをすべて1で初期化している。
for k = 2 to 100 step 1:
if A[k]≠0:
print k;
では、配列Aの値が0でないもの、すなわち、1のものを出力している。
従って、
for m = 2 to 10 step 1:
for k = a to b step c :
A[k] = 0;
では、2の倍数や3の倍数など、素数でない数字についてAの配列の値を0にしていることが分かる。
考え方としては、
2以外の2の倍数、つまり2×2以上の2の倍数について、0をセットして除く
3以外の3の倍数、つまり2×3以上の3の倍数について、0をセットして除く
4以外の4の倍数、つまり2×4以上の4の倍数について、0をセットして除く
(但し、4については、2の倍数について0をセットするループ内で、既に除かれている。事実上、意味はないが、ロジック上やむを得ない)
5以外の5の倍数、つまり2×5以上の5の倍数について、0をセットして除く
・・・
ということになり、終値は100まで、増分はmである。
問6 | 目次 | 問8 |