戦国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 情報処理技術者試験対策アプリ

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