令和7年度 科目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
答えと解説を見る
✓ これが正解アrest ≧ 0
解説
残りが0円でも1通り数えるので、条件はrest ≧ 0です。
このプログラムは、10円玉を0枚、1枚、2枚…と増やしながら、そのつど残りの金額restを1円玉と5円玉だけで払う組合せの数、つまり(rest ÷ 5 の商)+1を足していきます。1回の繰返し処理が10円玉の枚数1通りに当たり、終わるたびにrestから10を引きます。軸は、restがいくつのときまで数えるべきか、特にrestがちょうど0になった場合を数えるかどうかです。
問題文の12円の例で追うと、1回目はrest=12でcountに3を足し、restは2になります。2回目はrest=2でcountに1を足して4になり、restは-8になります。ここで止まれば4通りで、例の答えと一致します。つまり、restが2のような5未満の正の値でも、繰返しを続ける必要があります。
次にn=20で追います。rest=20でcountは5、rest=10でcountは5+3=8、rest=0でcountは8+1=9となり、restが-10になって止まります。10円玉2枚でちょうど20円にする払い方も1通りあるので、restが0のときも数えなければなりません。手で数えても、10円玉0枚で5通り、1枚で3通り、2枚で1通りの計9通りです。よって、負になったときだけ止める条件、rest ≧ 0が入ります。
見分け方は、端の値として残りがちょうど0円になる金額と、5円未満が残る金額の2つを入れて、数え漏れが無いかを確かめることです。
ほかの選択肢はなぜ違うのか
- イrest ≧ 5:restが5以上のときだけ回す条件では、12円の例で2回目のrest=2が数えられず、countは3で終わります。5円玉を使えない残りでも、1円玉だけで払う1通りがあるので数える必要があります。
- ウrest ≧ 10:restが10以上のときだけ回す条件では、10円玉をもう1枚使えるかどうかの判定になってしまい、最後の残りを数えません。12円ならrest=2の回が抜けて3通りとなり、例の4通りに届きません。
- エrest > 0:restが0より大きいときだけ回す条件は、12円のような例では合いますが、20円のように10円玉だけでちょうど払える金額で外れます。rest=0の回が抜けて8通りとなり、10円玉2枚の1通りを数え落とします。
- オrest > 5:restが5より大きいときだけ回す条件では、12円の例でrest=2の回が実行されず3通りになります。20円でもrest=0の回が抜けて8通りとなり、どちらの例でも正しい数より少なくなります。
- カrest > 10:restが10より大きいときだけ回す条件では、12円でrest=2の回が抜けて3通り、20円ではrest=10の時点で止まって5通りしか数えません。10円玉を使う払い方の多くが数え漏れになります。
出典:令和7年度 基本情報技術者試験 科目B 問2
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)