基本情報技術者試験過去問 令和7年度(2025年)科目B問2
次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
関数changeは,10より大きい整数を引数nで受け取り,1円玉,5円玉,10円玉を使ってちょうどn円にする組合せの総数を返す。
例えば,12円にする組合せは,次のように数えられる。10円玉を使わない場合には,1円玉と5円玉だけでちょうど12円にすることになる。その組合せは,使える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通りである。
-----------
〔プログラム〕
○整数型: change(整数型: n)
整数型: count ← 0
整数型: rest ← n
while ( )
count ← count + (rest ÷ 5 の商) + 1
rest ← rest - 10
endwhile
return count
-----------
選択肢
- ア:rest ≧ 0
- イ:rest ≧ 5
- ウ:rest ≧ 10
- エ:rest > 0
- オ:rest > 5
- カ:rest > 10
- ア
- イ
- ウ
- エ
- オ
- カ
正解と解き方・学習ポイント(AI解説)
restは、10円玉を一定枚数使った後に残る金額です。ループ1回で、そのrestを1円玉と5円玉だけで作る通り数(rest ÷ 5 の商)+1を加算し、次の10円玉枚数に進むためにrestを10減らします。残額が0円の場合も「5円玉0枚、1円玉0枚」の1通りとして数える必要があるため、restが0以上の間繰り返すrest≧0が正しい条件です。
Point
この問題は、whileの継続条件が「何を何回数えるための繰返し」かを理解できているかを問う問題です。restの意味を整理し、10円玉の枚数を0枚から最大枚数まで試すために、境界値の0を含めてループさせる必要があることを確認するのが狙いです。
解くために必要な知識
この問題を解くには、整数除算(商)とwhileによる繰返しが、どの範囲のケースを数える処理かを対応付けて理解する必要があります。
用語の整理
| 用語 | 意味 |
|---|---|
| while文 | 条件が真の間、処理を繰り返す制御構造です。 |
| 整数除算(商) | 割り算の結果の小数部を切り捨てた整数部分です。例: 12 ÷ 5 の商 = 2 です。 |
| 組合せの総数 | 硬貨の種類ごとの枚数の組を、重複なく数えた通り数です。 |
このプログラムで行っている数え方
10円玉の枚数で場合分けします
-
rest = n の回は10円玉0枚の場合です
-
restを10減らすたびに、10円玉の枚数が1枚増えた場合になります
固定したrestに対して、1円玉と5円玉の通り数を足します
rest円を1円玉と5円玉で作るとき
-
5円玉の最大枚数 = rest ÷ 5 の商
-
通り数 = (rest ÷ 5 の商) + 1
境界値0を含める理由
rest = 0 のときも、次の1通りが成立します。
- 5円玉0枚、1円玉0枚
そのため、ループ継続条件は「restが0以上」であることが必要です。
問題の解法手順
解く手順
1. 変数restの意味を整理します
restは、10円玉を何枚か使ったあとの残額です。
- ループ1回ごとにrestを10減らすので、10円玉を1枚増やしたことに対応します。
2. 1回のループで加算している値を確認します
countに加算している値は (rest ÷ 5 の商) + 1 です。
これは、残額restを1円玉と5円玉で作る組合せ数です。
-
5円玉は0枚からrest ÷ 5 の商枚まで選べます
-
そのため通り数は「最大枚数 + 1」です
3. while条件でrest = 0を含めるべきか確認します
rest = 0のときは、1円玉0枚・5円玉0枚でちょうど0円にできます。
- (0 ÷ 5 の商) + 1 = 0 + 1 = 1
よって、rest = 0でも加算すべきであり、条件はrest ≧ 0になります。
4. 動作確認(n = 20の例)
| 10円玉の枚数 | rest | 加算される通り数 (rest ÷ 5 の商) + 1 | count |
|---|---|---|---|
| 0 | 20 | 4 + 1 = 5 | 5 |
| 1 | 10 | 2 + 1 = 3 | 8 |
| 2 | 0 | 0 + 1 = 1 | 9 |
| 3 | -10 | ループ終了 | 9 |
rest = 0の行(10円玉2枚)を数えない条件(rest > 0など)にすると、1通り不足します。
選択肢ごとの解説
- ア:正解
restが0以上の間、10円玉を0枚、1枚、2枚、…と増やした全てのケースを数えられます。rest=0のときも(0 ÷ 5 の商)+1=1となり、成立する組合せを1通りとして加算できるため正解です。
- イ:不正解
restが0以上4以下になった時点でループが止まり、restが0のときの1通りなどが数えられません。よって誤りです。
- ウ:不正解
restが0〜9のときにループが実行されず、多くの組合せを数えません。例のn = 12でも、10円玉1枚のケース(rest = 2)を数えないため不足します。よって誤りです。
- エ:不正解
rest=0のケースを除外します。rest=0でも(0 ÷ 5 の商)+1=1の1通りがあるため、組合せ数が不足します。よって誤りです。
- オ:不正解
restが0〜5のケースを除外します。rest=5やrest=0も有効なケースなので、組合せ数を少なく数えます。よって誤りです。
- カ:不正解
restが0〜10のケースを除外します。rest=10、rest=5、rest=0など有効なケースを多く除外するため、正しい総数になりません。よって誤りです。
まとめ
restは、10円玉を一定枚数使った後に残る金額です。ループ1回で、そのrestを1円玉と5円玉だけで作る通り数(rest ÷ 5 の商)+1を加算し、次の10円玉枚数に進むためにrestを10減らします。残額が0円の場合も「5円玉0枚、1円玉0枚」の1通りとして数える必要があるため、restが0以上の間繰り返すrest≧0が正しい条件です。
restが0以上の間、10円玉を0枚、1枚、2枚、…と増やした全てのケースを数えられます。rest=0のときも(0 ÷ 5 の商)+1=1となり、成立する組合せを1通りとして加算できるため正解です。
restが0以上4以下になった時点でループが止まり、restが0のときの1通りなどが数えられません。よって誤りです。
restが0〜9のときにループが実行されず、多くの組合せを数えません。例のn = 12でも、10円玉1枚のケース(rest = 2)を数えないため不足します。よって誤りです。
rest=0のケースを除外します。rest=0でも(0 ÷ 5 の商)+1=1の1通りがあるため、組合せ数が不足します。よって誤りです。
restが0〜5のケースを除外します。rest=5やrest=0も有効なケースなので、組合せ数を少なく数えます。よって誤りです。
restが0〜10のケースを除外します。rest=10、rest=5、rest=0など有効なケースを多く除外するため、正しい総数になりません。よって誤りです。