少ない枚数でお金をやり取りする方法
2025年度から始まる新しい大学入学共通テストで新たに情報1が出題されます。大学入試センターが公表した試作問題(2021年3月)を、このたび初めてやってみました。そのうちの1問を、手直しして紹介しましょう。仮タイトル「なるべく少ない枚数でお金をやり取りする方法」です。
プログラミングの問題ですが、問題文の出だしの自然な問いかけがとても良い。でも、この後うんざりするような長くて考えにくい問題文が続きます。
どうしてそうなるかというと、プログラム言語が特定されておらず、いろんな言語に対応するような作りになっているからです。逆に言うと、特定のプログラム言語が多少とも使えるなら、その言語に対応した問題文であれば、だいぶやりやすいでしょう。
では、ここでプログラム言語 Python で問題を作り直してみましょう。元の問題はB5用紙6ページに渡る長文ですが、なるべくコンパクトに書いてみます。
こんなヒント(逆に読み難くなるのかもしれないが)を織り交ぜながら問題文が進んで、いったん次のようなプログラム(最終的な完成品ではなく、いわばパーツと言えるもの)が出来上がります。
ここでは100円以下の商品を買うものとしています。使うコインは 1 円,5 円, 10 円, 50 円, 100 円の5種類です。
price = int(input()) # 整数値を入力して、変数priceに代入
count = 0 # コイン枚数の初期値を0とする
money = price # 変数priceと同じ値を変数moneyに代入する
coin = [100,50,10,5,1] # 5種類のコインを配列形式で定義
for i in range (5) : # 金種の大きいものから小さいものへ順に処理する
count = count + _____ア_____ # コイン枚数を増やす
money = _____イ_____ # 残りの金額を求める
print (count) # コイン枚数を表示する
次に、次のステップに進むための準備として、下のように関数 coins を定義して、プログラムを書き換えました。関数 coins は「変数 money とちょうど同じ金額になるコイン枚数の最小値」を返す関数です。
def coins(money): # ここから関数定義
count = 0 # 関数名は coins、変数は money
coin = [100,50,10,5,1]
for i in range (5) :
count = count + _____ア_____
money = _____イ_____
return ___ウ___ # 返り値が(ウ)
price = int(input()) # ここからプログラム本体
print (coins (price)) # ここで関数 coins を呼び出して、返り値を表示
このとき coins (46) は 値 6 となります。
ところで、同じ46円を支払うのに,51円を支払って釣り銭5円を受け取る払い方では,支払いに2枚,釣り銭に1枚で,合計3枚の硬貨のやり取りになります。
def coins(money): # ここから関数定義
count = 0 # 関数名は coins、変数は money
coin = [100,50,10,5,1]
for i in range (5) :
count = count + _____ア_____
money = _____イ_____
return ___ウ___
price = int(input()) # ここからプログラム本体
min_coins = 100 # 変数 min_coins の初期値を 100 とした
for back in range(100): # 釣り back を0円から100円まで変えてみる
give = price + back # 価格 price と釣り back の和 give を渡す
maisu = ____オ____ + ____カ____
if ____キ____ < min_coins:
____ク____ = ____キ____
print (min_coins) # 最後に「最小交換硬貨枚数」を表示する
お疲れ様でした。答えはこちら(↓)です。