問題(令和8年 問85)
関数isPrirneは,引数として与えられた正の整数が,素数であればtrueを,素数でなければ falseを戻り値とする。例えば,関数 isPr ime を isPrirne(2)として呼び出したときの戻り値はtrueである。プログラム中のa, bに入れる字句の適切な組合せはどれか。
| [プログラム] | 説明 | ||||||||
| 〇 | 論理型:isPrime(整数型: num) | ||||||||
| 整数型:div ← 2 | 変数として minlndex, j, kを使う | ||||||||
| if ( num が 2 a | |||||||||
| return false | |||||||||
| else | 繰り返し処理で行う処理の説明 | ||||||||
| while ( num が div b ) | jの値をminlndexに代入する | ||||||||
| if ( num÷div の余りが 0 と等しい) | |||||||||
| return false | kの値をminlndexに代入する | ||||||||
| else | 判別処理の終了 | ||||||||
| div ← div + 1 | 繰返し処理の終了 | ||||||||
| end if | |||||||||
| endwhile | |||||||||
| return true | 途中経過確認の処理を説明 | ||||||||
| end if | 繰返し処理の段階を示している | ||||||||
| a | b | |
ア | 以下 | と等しい |
イ | 以下 | より大きい |
ウ | より小さい | と等しい |
エ | より小さい | より大きい |
解き方(令和8年 問85)
問題の要点を読み取る
はじめに、問題文から関数isPrirneをイメージしましょう。
問題文の中で、「引数」「戻り値」と書かれている部分をを手がかりに、ポイントを押さえます。
| 問題文 | → | 読み取れること | |
| 関数isPrirneは,引数として与えられた(引数)正の整数が,(選択)(戻り値)素数であればtrueを,素数でなければ falseを戻り値とする。例えば,関数 isPrime を isPrirne(2)として呼び出したときの戻り値はtrueである。 | ![]() | ||
素数とは?
素数とは「2以上の自然数で、1と自分自身以外に約数がない数」です。
このままでは、プログラムについて考えにくいので、条件を分けて整理します。
素数
次の3つの条件を満たす数
条件1:正の整数(自然数)である
条件2:2以上である
条件3:1とその数自身以外に約数を持たない
プログラム処理のおおよそをつかむ
(手順1)
プログラム中のif~end if、while~end whileなどの用語を手がかりにして色分けします。
色分けすることで、プログラムの構成がはっきりして、それぞれの部分で何をしているのか考えやすくなります。
(手順2)
上で整理した素数の条件について、プログラム中のどの部分で確認しているか調べます。
| {プログラム} | 説明 | ||||||||
| 〇 | 論理型:isPrime(整数型: num) | numは、引数 | |||||||
| 整数型:div ← 2 | |||||||||
| if ( num が 2 a ) | a には、 ”以下” or ”より小さい” が入る 2以上であるかの確認 (上の条件2にあたる) | ||||||||
| return false | 戻り値 false(素数でない) | ||||||||
| else | |||||||||
| while ( num が div b ) | (num が div b )が”真”の間、処理を実行する bには、 ”と等しい” or ”より大きい” が入る | ||||||||
| if ( num÷div の余りが 0 と等しい) | ↑ | 割り切れるか調べている | |||||||
| return false | | | ||||||||
| else | 約数についての確認 (上の条件3にあたる) | ||||||||
| div ← div + 1 | | | ||||||||
| end if | ↓ | ||||||||
| endwhile | ここまで、前判定繰返し処理 | ||||||||
| return true | 戻り値 true (素数である) | ||||||||
| end if | |||||||||
なお、問題文に、プログラムの引数が”正の整数”とあり、条件1を満たした整数が入力されるので、プログラム中での確認はありません。
a について考える
a に ”以下” を入れて考えてみます。
プログラムは、下のようになります。
| {プログラム} | 説明 | ||||||||
| 〇 | 論理型:isPrime(整数型: num) | ||||||||
| 整数型:div ← 2 | |||||||||
| if ( num が 2 以下 ) | isPrirne(2)のとき、 num≦2が成り立つので、return false へ | ||||||||
| return false | 戻り値 が false なので、2は素数でないことになる | ||||||||
| else | 問題文と矛盾! | ||||||||
| 以下省略 | |||||||||
プログラムの動作によると、isPrirne(2)の戻り値 は false となります。これは、問題文の「isPrirne(2)として呼び出したときの戻り値は true である。」に矛盾します。
a には、 ”以下” ではなく、 ”より小さい” が適切です。
b について考える
bに ”と等しい” を入れて考えてみます。
前の結果より、aには ”より小さい” を入れます。
プログラムは、下のようになります。
| {プログラム} | 説明 | ||||||||
| 〇 | 論理型:isPrime(整数型: num) | ||||||||
| 整数型:div ← 2 | |||||||||
| if ( num が 2 ”より小さい” ) | num<2が成り立たないので、while へ | ||||||||
| return false | 戻り値 false(素数でない) | ||||||||
| else | |||||||||
| while ( num が div ”と等しい” ) | (num が div ”と等しい” )間、処理を実行する 言い換えると、等しくなければ、すべて、return true へ | ||||||||
| if ( num÷div の余りが 0 と等しい) | ↑ | 約数の確認ができない! | |||||||
| return false | ❘ | ||||||||
| else | 約数についての確認 | ||||||||
| div ← div + 1 | | | ||||||||
| end if | ↓ | ||||||||
| endwhile | ここまで、前判定繰返し処理 | ||||||||
| return true | 戻り値 true (素数である) | ||||||||
| end if | |||||||||
この場合、whileは、「num が divと等しい間、処理を実行する」となり、num と div が等しくない場合は、約数の確認をする処理を飛ばして、return true に進みます。これでは、約数の確認ができません。
b には、 ”と等しい” ではなく、 ”より大きい” が適切です。
a と b の結果から
a には ”より小さい” 、b には ”より大きい” が適切なので、正解は エ です。



コメント