基本情報技術者

問2

基本情報技術者試験過去問 令和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が正しい条件です。

正解

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など有効なケースを多く除外するため、正しい総数になりません。よって誤りです。

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が正しい条件です。

順次、単語を追加予定です。もうしばらくお待ちください。