HOME»基本情報技術者令和5年»[科目B]問1
基本情報技術者令和5年 [科目B]問1
問1
次のプログラム中のaとbに入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
関数 findPrimeNumbers は,引数で与えられた整数以下の,全ての素数だけを格納した配列を返す関数である。ここで,引数に与える整数は2以上である。
〔プログラム〕
関数 findPrimeNumbers は,引数で与えられた整数以下の,全ての素数だけを格納した配列を返す関数である。ここで,引数に与える整数は2以上である。
〔プログラム〕
分類
アルゴリズムとプログラミング » プログラムの基本要素
正解
ア
解説
素数(英語では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と等しい」という条件式が当てはまります。
したがって正しい組合せは「ア」です。
〔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と等しい」という条件式が当てはまります。
したがって正しい組合せは「ア」です。