戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

応用情報技術者 2013年 春期 午前207


問題文

配列Aに対して次の手続を実行して,2≦k≦100である素数んだけを全て出力したい。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;
応用情報技術者 2013年 春期 午前2 問07の選択肢の画像

選択肢

(正解)

配列Aに対する素数判定ループの初期値・終値・増分の選択【午前2 解説】

要点まとめ

  • 結論:ループ変数kの初期値は2m、終値は100、増分はmとする(選択肢イが正解)です。
  • 根拠:エラトステネスの篩のアルゴリズムでは、mの倍数をm²から100までm刻みで消去します。
  • 差がつくポイント:m²から始める理由と増分mの意味を理解し、誤って2やmから始めないことが重要です。

正解の理由

選択肢イの「a=2m、b=100、c=m」は、エラトステネスの篩の典型的な実装に合致します。
  • ループはmの倍数を消すため、初期値はmの2倍(2m)から始めるのが一般的ですが、実際にはm²から始めることも多いです。
  • ただし、問題文のループは「for m=2 to 10 step 1」でmを変え、kのループでmの倍数を消すため、kはmの倍数で増加(増分c=m)し、終値は100までです。
  • これにより、2≦k≦100の範囲でmの倍数を正しく消去し、素数だけが残ります。

よくある誤解

  • 初期値を2やmにしてしまい、m²から始めるべきところを誤ることがあります。
  • 増分を1にしてしまい、mの倍数を正しくスキップできないことがあります。

解法ステップ

  1. エラトステネスの篩の基本を理解する(素数判定のために倍数を消す)。
  2. 外側ループmは2から10まで(√100まで)回す。
  3. 内側ループkはmの倍数を消すため、初期値はm²または2mから始める。
  4. 増分はmで、kをmの倍数に限定する。
  5. 終値は100まで設定し、配列Aの該当要素を0にする。
  6. 最後にA[k]が0でないkを出力し、素数を表示する。

選択肢別の誤答解説

  • ア(a=2, b=m²、c=1):kの増分が1でmの倍数を飛ばさず、効率的でなく誤り。
  • イ(a=2m, b=100, c=m):正解。mの倍数を2mから100までm刻みで消去。
  • ウ(a=m, b=m²、c=m):終値がm²で範囲が狭く、100まで消去できず不十分。
  • エ(a=m²、b=100, c=1):増分が1でmの倍数を飛ばさず非効率かつ誤り。

補足コラム

エラトステネスの篩は古典的な素数判定アルゴリズムで、までの素数を効率的に求める方法です。
内側ループの初期値をにする理由は、それより小さい倍数は既に消去済みだからです。
増分をにすることで、mの倍数だけを効率的に消去できます。

FAQ

Q: なぜ内側ループの初期値はなのですか?
A: 未満の倍数は既に小さい素数の倍数として消去済みのため、重複を避けるためです。
Q: 増分を1にすると何が問題ですか?
A: すべての数を1ずつ増やすため、mの倍数だけを効率的に消去できず計算量が増えます。

関連キーワード: エラトステネスの篩、素数判定、ループ制御、配列操作、アルゴリズム
← 前の問題へ次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてプライバシーポリシー利用規約特商法表記開発者について