過去問解きまくり研究所 ホーム

令和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

解説

残りが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つを入れて、数え漏れが無いかを確かめることです。

ほかの選択肢はなぜ違うのか

出典:令和7年度 基本情報技術者試験 科目B 問2

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)