関数 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
令和8年度 ITパスポート試験 問85
この問題の解説と、これまでの解答の記録です。
問 85
不正解ア
a を「以下」とすると num=2 で「2 が 2 以下」が真となり即 return false になってしまい、isPrime(2) が true という条件に反します。さらに b の「と等しい」も誤りで、num=4 では「4 が 2 と等しい」が偽でループに入らず return true となり、合成数の 4 を素数と誤判定します。
不正解イ
b(より大きい)は正しいものの、a を「以下」とした点が誤りです。num=2 で「2 が 2 以下」が真となって return false となり、isPrime(2)=true を満たせません。素数である 2 自身を弾いてしまいます。
不正解ウ
a(より小さい)は正しいものの、b を「と等しい」とした点が誤りです。while 条件が「num が div と等しい」だと、num=4 で div=2 のとき「4 が 2 と等しい」は偽となりループに入らず return true となり、合成数の 4 を素数と誤判定します。割り算による判定が一度も行われません。
- エ
正解 正解はエ (a:より小さい, b:より大きい)。div を 2 から増やしながら割り切れるかを調べる素数判定です。まず a:最初の if は「2 未満の値 (1 など) を素数でないとして弾く」ためのもので、num=2 のときは true を返さねばなりません。a を「より小さい」とすると num=2 では「2 が 2 より小さい」は偽となり else へ進み、正しく判定が続きます。次に b:while は割る数 div を 2 から num の手前まで増やしながら割り切れるかを試すループで、条件は「div が num に達するまで=num が div より大きい間」繰り返します。例えば num=4 では div=2 のとき「4 が 2 より大きい」は真でループに入り、4÷2 の余りが 0 なので false。num=2 では「2 が 2 より大きい」は偽でループに入らず return true。num=3 では div=2 で余り 1、div=3 に増えて「3 が 3 より大きい」が偽となり return true。すべて正しく判定できます。
- 素数判定アルゴリズム:div を 2 から num の手前まで増やし、いずれかで割り切れれば合成数 (false)、最後まで割り切れなければ素数 (true)。
- 擬似言語の条件式と境界値の読み方:if の早期 return が弾く範囲 (2 未満) と while の継続条件 (div が num に達するまで) を、isPrime(2)=true などの具体例で検証して確定する。