問題
問1
次のプログラム中の 【 a 】と 【 b 】に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
関数 findPrimeNumbers は,引数で与えられた整数以下の,全ての素数だけを格納した配列を返す関数である。ここで,引数に与える整数は2以上とする。


[出典:基本情報技術者試験 令和5年度(科目B) 問1]
正解
正解は「ア」です。
解説
この問題は、与えられた最大値以下の「素数」を求めるプログラムの空欄を補うものです。
素数とは、1と自分自身以外に約数を持たない自然数です。このような数を求めるために、2からmaxNumまでの数値を対象に、すでに出現した小さい整数で割り切れるかを判定し、割り切れない場合に素数としてリストに追加しています。
まず a に入るのは、for文で「2からどこまで繰り返すか」を示す上限値です。素数をmaxNumまで調べる必要があるため、終了条件は「i ≤ maxNum」、つまり「a = maxNum」となります。
次に b に入るのは、iが素数であるかどうかの判定条件です。素数でないとは「それより小さな数で割り切れる数」であることを意味するため、iをjで割ったときの余りが0、つまり「i % j == 0」ならば割り切れるという条件を使います。よって「i ÷ j の余りが 0 と等しい」が正しい表現になります。
日常に例えると、「お菓子がちょうど人数分に分けられる」ならばその人数で割り切れる、という考え方です。割り切れてしまったらそれは素数ではないので、その数はスキップされます。
したがって、aは「maxNum」、bは「i ÷ j の余り が 0 と等しい」が正解です。
イ(i ÷ j の商 が 1 と等しくない):
商が1でないという条件では、素数かどうかを正確に判定できません。割り切れることを調べるには余りが0になるかをチェックする必要があります。
ウ(maxNum + 1):
ループ上限をmaxNum+1にすると、maxNumを超える値まで検査してしまうため不要な処理が増え、仕様と合致しません。
エ(i ÷ j の商 が 1 と等しくない):
割り切れ判定として不適切であるだけでなく、上限もmaxNum + 1のため、2つの面で誤りです。
難易度
この問題は「素数判定アルゴリズム」の基本的な構造を理解しているかを問うもので、プログラムの流れと割り算の意味を把握していれば解ける内容です。初学者にとっては「割り切れる=余りが0」という条件が重要なポイントとなるため、難易度は「やや易しい」程度です。
用語補足
素数:
1と自分自身以外では割り切れない自然数です。2, 3, 5, 7などが該当します。基本情報技術者試験では、アルゴリズムの基礎として頻出です。
余り(剰余):
割り算において、割り切れなかった部分です。たとえば7 ÷ 3は商が2で余りが1です。「余りが0」は割り切れたことを意味します。
for文:
プログラムで繰り返し処理を行う構文の一つです。「初期値」「条件」「増分」の3つで制御され、一定範囲内の処理を何度も実行するのに使われます。
対策
素数判定アルゴリズムは基本情報試験で頻出のアルゴリズムです。for文の構造、割り算の余りの意味、ループ終了条件など、基本的な構文をしっかり理解することが大切です。特に「割り切れる」の判断として「余りが0であるか」を使う点を確実に身につけておきましょう。