問題
問2
次のプログラム中の【 】に入れる正しい答えを、解答群の中から選べ。
関数changeは、10より大きい整数を引数nで受け取り、1円玉、5円玉、10円玉を使ってちょうどn円にする組合せの総数を返す。
例えば、12円にする組合せは、次のように数えられる。10円玉を使わない場合には、1円玉と5円玉だけでちょうど12円にすることになる。10円玉を使わない場合の5円玉の枚数が0以上(12 ÷ 5 の商)以下なので、(12 ÷ 5 の商)+1 = 3通りある。同様に、10円玉を1枚使う場合には、1円玉と5円玉だけでちょうど2円にすることになり、その組合せは(2 ÷ 5 の商)+1 = 1通りある。10円玉を2枚以上使う組合せはない。よって、1円玉、5円玉、10円玉を使ってちょうど12円にする組合せは、3+1=4通りである。

- ア:rest ≧ 0
- イ:rest ≧ 5
- ウ:rest ≧ 10
- エ:rest > 0
- オ:rest > 5
- カ:rest > 10
[出典:基本情報技術者試験 令和7年度(科目B) 問2]
正解
正解は「ア」です。
解説
この問題は「お金の両替問題」に似た仕組みを考える問題です。プログラムchangeは、10円玉を使う枚数ごとに場合分けして組合せの総数を計算しています。最初に「rest ← n」として、残りの金額restがn円から始まることに注目します。ここでwhile文は「10円玉が使える間は繰り返す」仕組みになっているため、条件は「rest ≧ 0」が正しいと判断できます。
実際、10円玉を0枚使うケースも考慮する必要があるため、restが0円になっても1円玉や5円玉の組合せを考える必要があるからです。もし「rest > 0」にしてしまうと、ちょうど0円にする場合(例えばちょうど10円の場合)がカウントされなくなります。したがって、restが0円以上のときは必ずループを続けるべきです。
例えば、nが12円の場合、初めにrestは12なのでループ条件「rest ≧ 0」は満たされます。最初のループで10円玉を0枚使うケース(rest=12)をカウントし、その後restを2(12-10)として10円玉1枚使うケースを計算します。このようにして10円玉の使用枚数ごとに全ての組合せを加算できるように設計されています。
このような考え方から、条件式は「rest ≧ 0」とする選択肢アが正解となります。
イ(rest ≧ 5):
5円以上のときだけループが回るため、例えば残り4円やちょうど0円の場合の組合せが計算できなくなります。
ウ(rest ≧ 10):
10円未満の金額ではループが回らなくなるため、1円玉や5円玉のみで構成される組合せを無視してしまいます。
エ(rest > 0):
ちょうど0円になった場合にループが終了してしまい、0円から作れる組合せ(10円玉や5円玉を使わず1円玉のみのケース)がカウントされません。
オ(rest > 5):
残り5円以下のケースを無視するため、5円玉や1円玉だけで作れるパターンをカウントできません。
カ(rest > 10):
10円玉を使える場合にしかループしないため、それ以外の組合せがすべて無視されます。
難易度
この問題の難易度は「普通」です。初心者にはやや考えにくいですが、「0円」という状態も有効な組合せ対象になることや、ループ条件の役割を意識できれば比較的解きやすい問題です。繰り返し条件と金額処理を組み合わせた実用的な思考力が求められます。
用語補足
while文:
条件を満たしている間、処理を繰り返す制御構文です。条件が成立しないとループは終了します。例えると「財布の中にお金がある間はガチャガチャを回し続ける」といった仕組みです。
商(割り算):
割り算をした結果の「商」とは、割った結果何回入ったかを示す整数部分です。12 ÷ 5 の商は「2」となります。日常で言えば、5個入りの袋で何袋買えるか数えるのと同じです。
カウント処理:
条件が成立した回数や種類を数える処理です。ループの中で「1を加える」操作で回数を数え上げます。お店の入場者カウンターのような役割です。
解法のポイント
「while文」と「条件式」の関係性を明確に理解することが対策になります。特に「0」という値が持つ意味に注意し、ゼロのケースも含めてループが正しく設計されているかを考える癖を付けましょう。類似の「硬貨問題」の練習も有効です。


