過去問解きまくり研究所 ホーム

令和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

解答群は原典では a・b の組合せの表。

答えと解説を見る

✓ これが正解アa:maxNum / b:i ÷ j の余り が 0 と等しい

解説

aはmaxNum、bはi ÷ j の余りが0と等しい、の組合せです。

関数 findPrimeNumbers は、引数 maxNum 以下の素数だけを集めて返す関数です。素数とは、1 とその数自身でしか割り切れない 2 以上の整数のことです。決める軸は二つで、外側の繰返しで i をどこまで動かすかと、内側の繰返しで i が割り切れたことをどう判定するかです。

外側の for は i を 2 から順に増やし、i を素数の候補として調べます。maxNum 以下の数をすべて調べればよいので、終わりの値は maxNum です。内側の for は j を 2 から i の正の平方根の整数部分まで動かし、i が j で割り切れたら divideFlag を false にして繰返しを抜けます。割り切れることは、i ÷ j の余りが 0 と等しいことで表せます。

maxNum に 10 を与えて追ってみます。i=2 と 3 は平方根の整数部分が 1 なので内側は回らず、そのまま pnList に追加されます。i=4 は j=2 で余り 0 となり除かれます。i=5 と 7 は j=2 で余りが 1 なので追加され、i=9 は j=3 で余り 0 となり除かれます。結果は {2, 3, 5, 7} で、10 以下の素数と一致します。

空欄に入る式を選ぶときは、小さな引数で実際に一周追い、範囲の端の数と最初に除かれる合成数が正しく扱われるかを確かめると見分けられます。

ほかの選択肢はなぜ違うのか

出典:令和5年度 基本情報技術者試験 科目B 問1

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)