令和5年試験問題 [科目B]問1

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
次のプログラム中のabに入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。

 関数 findPrimeNumbers は,引数で与えられた整数以下の,全ての素数だけを格納した配列を返す関数である。ここで,引数に与える整数は2以上である。

〔プログラム〕
b01_1.png

b01_2.png
正解 問題へ
分野:アルゴリズムとプログラミング
カテゴリ:プログラムの基本要素
解説
素数(英語ではprime number)とは、2以上の自然数であり、1とその数以外では割り切れない数のことです。素数を小さい順から列挙すると、2、3、5、7、11、…となります。このプログラムは、素数判定アルゴリズムとして最も単純である「試し割り法」をプログラムとして実装したものです。「試し割り法」は、ある数について、2で割る、3で割る、4で割る、…を繰り返して、判定対象となる数の平方根まで割り切れなければ、素数として判定するというものです。

aについて〕
プログラムの終盤を見ると、divideFlag が true と等しければ、ループ変数 i を配列 pnList に追加し、最終的に配列 pnList を素数のリストとして返しています。これより、ループ変数 i は現在判定対象となっている数を保持する変数として使われていることがわかります。

素数は2以上の自然数ですから、引数の maxNum 以下のうち、素数であるかどうかを判定すべき数は2~maxNumまでの整数です。したがって、空欄aには「maxNum」が当てはまります。maxNum+1 にしてしまうと、引数の数より1大きいものまで素数として返されてしまう可能性があるため正しくありません。

bについて〕
空欄bは、二重のforループの内側に位置していて、if文の条件式となっています。また、空欄bの条件式が true のときには、次の行で変数 divideFlag に false を格納しています。

どの選択肢でも i÷j をしているように、ここでは、変数 i に対して、変数 j を2から変数 i の平方根まで増やしながら除算することを繰り返しています。解説冒頭の「試し割り法」では、「ある数について、2で割る、3で割る、4で割る、…を繰り返して」に相当します。

divideFlag が false になった場合、後続のif文で変数 i の値が配列 pnList に格納されなくなるので、divideFlag を false にするということは、すなわち現在の変数 i の値を「素数ではない」と判定していることになります。

変数 i が素数でないと判定するのは、変数 i に割り切れる数がある場合、つまり、i÷j の余りが0となるときなので、空欄bには「i÷j の余りが0と等しい」という条件式が当てはまります。

したがって正しい組合せは「ア」です。

Pagetop