科目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 の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)
解説に誤りを見つけたら、解説の誤りを報告してください。
答えと解説を見る
正解:ア
覚える知識
素数判定(平方根までの試し割り)
整数 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 でない」は、割り切れるかどうか(余り)と商を取り違えさせる選択肢です。