本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

平成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 │ 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