戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

ITパスポート 2026年 85


問題文

関数isPrimeは、引数として与えられた正の整数が、素数であればtrueを、素数でなければfalseを戻り値とする。例えば、関数isPrimeをisPrime(2)として呼び出したときの戻り値はtrueである。プログラム中のa, bに入れる字句の適切な組合せはどれか。
〔プログラム〕  ○論理型: 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
ITパスポート 2026年  問85の選択肢の画像

選択肢

(正解)

🔒 解説は解答すると表示されます

素数判定プログラムの空欄補充【ITパスポート 解説】

正解の理由

問題の目的は「引数 num が素数(1 と自分自身以外に約数を持たない正の整数)かどうか」を判定することです。プログラムの流れは次の通りです。
  • div を 2 で初期化し、2 から順に割り算していく(割り切れれば素数でない)。
  • 割り切れる数が見つからなければ素数と判定する。
このアルゴリズムで、if 節の条件(a)は「2 未満の数(1 や 0 など)は素数ではない」と判定して早く false を返すために使います。したがって a は「より小さい(2 より小さい)」が正しいです。一方、ループ条件(b)は「div が num より小さい間(つまり div = 2,3,...,num-1)だけ調べる」必要があるため、b は「より大きい(num が div より大きい)」が正しいです。
以上より、a が「より小さい」、b が「より大きい」である組合せ、すなわち選択肢の が正解です。

解法ステップ

  1. 素数の定義を確認する:1 より大きく、自分自身と 1 以外に約数がない整数。
  2. 早期判定(if 節)で 2 未満の数を弾く:
    • 0 や 1 は素数でないので false を返すべき。
    • 2 は素数なのでここで弾かない(if が false である必要がある)。
  3. ループで 2 から順に割り算を試す(div を 2 から始めて、num-1 まで試す):
    • もし余りが 0()なら合成数(素数でない)だから false。
    • 最後まで割り切れるものがなければ true(素数)。
  4. 条件を満たす文字列を当てはめる:a = 「より小さい」、b = 「より大きい」。

選択肢別の誤答解説

  • ア(a: 以下、b: と等しい)
    a が「以下(≤)」だと num = 2 のとき if が真になり、2 のとき false を返してしまいます。これは問題文の「isPrime(2) の戻り値が true」と矛盾します。b が「と等しい(=)」だと while がほとんど実行されず、正しく判定できません。
  • イ(a: 以下、b: より大きい)
    a の「以下(≤)」が誤りのため不適。num = 2 のとき誤って false を返します。
  • ウ(a: より小さい、b: と等しい)
    a は正しい(2 未満を弾く)が、b が「と等しい」だと while (num == div) の意味になり、通常ループが実行されず正しい判定ができません(div は 2 で固定され、num が 2 のときのみ真になります)。
  • エ(a: より小さい、b: より大きい)
    a が「num が 2 より小さいとき false」を意味し 1 や 0 を弾けます。b が「num が div より大きい(num > div)」であれば div が 2 から num-1 まで回り、約数を正しく検査できます。したがって処理が意図通りになります(正解)。

よくある誤解

  • 「2 を特別扱いするのは不要」
    2 は最小の素数なので、特に if で 2 を弾いてしまうと誤判定になります。2 は素数として残す必要があります。
  • 「ループ条件を <= にすれば良い」と思うミス
    div ≤ num とすると div = num のときも調べてしまい、必ず最後に num % num == 0 となり誤って合成数扱い(false)になるのでダメです。
  • 「div を 2 以外から始めると早く判定できる」と考える誤り
    例えば奇数だけ調べる高速化は可能ですが、その前に 2 の扱い(偶数かどうか)を別に処理するなど注意が必要です。

補足コラム

より効率的な方法:
  • div を 2 から num-1 まで調べると計算量は で大きな数に不向きです。改善策として div の上限を (num の平方根)にすれば十分です。理由は、もし num = a × b と分解できるなら、どちらか一方は だからです。
    具体的なループ条件は「div × div ≤ num(または div ≤ √num)」にすればよいです。
  • さらに速くするにはエラトステネスの篩(ふるい)や確率的素数判定(ミラー–ラビンなど)がありますが、初学者はまず基本的な割り算ループの考え方を押さえましょう。
簡単な実装例(Python):
def isPrime(num: int) -> bool:
    if num < 2:          # 2 より小さい -> 素数ではない
        return False
    div = 2
    while num > div:     # div が num より小さい間(2..num-1)を調べる
        if num % div == 0:
            return False
        div += 1
    return True

FAQ

Q: なぜ 1 は素数ではないのですか?
A: 素数は「1 と自分自身以外に約数を持たない」整数です。1 は約数の数が 1 個しかなく定義に合わないため、素数としません(数学上の取り決めです)。
Q: num が 2 のときはどう動くのですか?
A: a の条件が「より小さい(num < 2)」なら false になり else に進みます。div = 2 のとき while (num > div) は false(2 > 2 は偽)でループに入らず、そのまま return true となり 2 は素数と判定されます。
Q: 負の数や 0 はどう扱うべきですか?
A: ここでは「正の整数が引数」とあるので対象外ですが、実装では負の数や 0 を最初に弾して false を返すのが安全です。

関連キーワード: 素数判定、mod(余り演算)、ループ条件、平方根判定、アルゴリズム最適化
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

ITパスポート
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について