令和8年度 ITパスポート試験 公開問題 問85

関数 isPrime は,引数として与えられた正の整数が,素数であれば true を,素数でなければ false を戻り値とする。例えば,関数 isPrime を isPrime(2) として呼び出したときの戻り値は true である。プログラム中の a, b に入れる字句の適切な組合せはどれか。

素数判定を行う関数 isPrime の擬似コード
図の説明テキスト

素数判定を行う関数 isPrime の擬似コード。
○論理型: isPrime(整数型: num)
整数型: div ← 2
if (num が 2 a)
return false
else
while (num が div b)
if (num ÷ div の余り が 0 と等しい)
return false
else
div ← div + 1
endif
endwhile
return true
endif

解答・解説

正解: エ. a: より小さい, b: より大きい

関数 isPrime の擬似コードを読み解き、空欄 a と b に入る適切な条件を考えます。

空欄 a について

問題文に「引数として与えられた正の整数が、素数であれば true を、素数でなければ false を戻り値とする」「isPrime(2) として呼び出したときの戻り値は true」と記述されています。
プログラムの最初の条件分岐は以下のようになっています。

if (num が 2 [ a ])
  return false

もし a に「以下」が入ると、num が 22 のときにも条件が成立してしまい、return false が実行されてしまいます。これでは isPrime(2) の戻り値が true にならないため不適切です。
一方、a に「より小さい」が入ると、引数である正の整数 num が 11 のときのみ条件が成立して false(素数ではない)を返し、22 のときは else の処理に進むため、正しく動作します。よって、a には「より小さい」が入ります。

空欄 b について

else 以降の処理では、div を初期値 22 から順に 11 ずつ増やしながら、num を div で割った余りが 00 になるか(割り切れるか)を確認しています。

while (num が div [ b ])
  if (num ÷ div の余り が 0 と等しい)
    return false

素数は「11 とその数自身以外に正の約数を持たない数」です。もし div が num と等しくなるまでループを実行してしまうと、必ず「num ÷ div の余り が 0 と等しい」が成立し、素数であっても誤って false が返されてしまいます。
そのため、割り切れるかどうかの判定は、div が num よりも小さい間(すなわち num が div より大きい間)だけ繰り返す必要があります。よって、b には「より大きい」が入ります。

各選択肢の解説

  • ア:a が「以下」だと isPrime(2) が false になってしまい、b が「と等しい」だと num と div が異なる場合にループが実行されないため誤りです。
  • イ:a が「以下」だと isPrime(2) が false になってしまうため誤りです。
  • ウ:b が「と等しい」だと num と div が異なる場合にループが実行されないため誤りです。
  • エ:a が「より小さい」、b が「より大きい」の組合せであり、正解です。

Spineチーム