科目B

令和5年度 基本情報技術者試験 科目B 公開問題 問1

次のプログラム中のaとbに入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。 関数 findPrimeNumbers は,引数で与えられた整数以下の,全ての素数だけを格納した配列を返す関数である。ここで,引数に与える整数は 2 以上である。 〔プログラム〕
○整数型の配列: findPrimeNumbers(整数型: maxNum)
  整数型の配列: pnList ← {}  // 要素数0の配列
  整数型: i, j
  論理型: divideFlag
  for (i を 2 から a まで 1 ずつ増やす)
    divideFlag ← true

    /* iの正の平方根の整数部分が2未満のときは,繰返し処理を実行しない */
    for (j を 2 から iの正の平方根の整数部分 まで 1 ずつ増やす)  // α
      if (b)
        divideFlag ← false
        αの行から始まる繰返し処理を終了する
      endif
    endfor
    if (divideFlag が true と等しい)
      pnListの末尾 に iの値 を追加する
    endif
  endfor
  return pnList
答えを選ぶ

出典:令和5年度 基本情報技術者試験 科目B 公開問題 問1(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)

科目Bの解き方と全問の一覧

解説に誤りを見つけたら、解説の誤りを報告してください。

答えと解説を見る

正解:ア

覚える知識

素数判定(平方根までの試し割り)

整数 i が素数かどうかは、2 から √i の整数部分までの数で割り、どれでも割り切れなければ素数と判定できます。i に √i より大きい約数があれば、対になる √i 以下の約数も必ずあるからです。

この問題で必要なこと

外側のループは maxNum「以下」の素数を調べるので、i を 2 から maxNum まで回します。maxNum+1 まで回すと、maxNum を超える数まで判定してしまいます。内側のループでは、i が j で割り切れるか(i ÷ j の余り が 0)を調べ、割り切れたら素数ではないと判定します。したがって a は maxNum、b は余りが 0 の条件となり、正解はアです。

ひっかけ

ウ・エは、ループの上限を maxNum+1 にする「±1」の思い違いを誘います。イ・エの「商が 1 でない」は、割り切れるかどうか(余り)と商を取り違えさせる選択肢です。