関数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
正答4
解説
正解は4です。
図のプログラムでは、まずnumを2と比べてaの条件が成り立てばfalseを返します。
そうでなければ、divを2から1ずつ増やしながら、bの条件が成り立つ間、numがdivで割り切れるかを調べます。
割り切れたらfalseを返し、最後まで割り切れなければtrueを返します。
【計算】
aについて、素数は2以上なので、1はfalseにする必要があります。
また、問題文の例からisPrime(2)はtrueなので、2はfalseにしてはいけません。
したがって、aは「numが2より小さい」が適切です。
bについて、2からnum−1までのdivで割り切れるかを調べればよいので、「numがdivより大きい」間を繰り返します。
b=より大きいの場合、isPrime(2)では2>2が成り立たないのでループに入らず、trueが返ります。
isPrime(4)では4>2が成り立ち、4÷2の余りが0なのでfalseが返ります。
isPrime(5)ではdivが2、3、4のどれでも割り切れず、divが5になってループを抜け、trueが返ります。
【選択肢別解説】
1:× a=以下だと、isPrime(2)で2が2以下となりfalseが返るので、例と合いません。
また、b=と等しいでは、3以上のnumは最初のdivの2と等しくならないので、ループに一度も入りません。
そのため、4のような合成数でもtrueが返ってしまいます。
2:× b=より大きいは正しいですが、a=以下だとisPrime(2)がfalseになり、例と合いません。
3:× a=より小さいは正しいですが、b=と等しいが誤りです。
isPrime(2)では2と2が等しいのでループに入り、2÷2の余りが0となってfalseが返ってしまいます。
4:○ a=より小さい、b=より大きいの組合せで、1はfalse、2や5はtrue、4はfalseと、正しく判定できます。
【ポイント】
空欄補充の問題は、問題文に示された例(ここではisPrime(2)がtrue)を当てはめて確かめると、候補を絞り込めます。
素数は1とその数自身以外に約数をもたない2以上の整数です。