先日(1月17日)より、ゆうちょATMの手数料が変更になり、小銭の入出金で手数料を取られるようになってしまいました。電子マネーでの決済が進んできているとはいえ、まだまだ現金しか使えないお店もあります。そのため小銭の扱いが貴重な時代になりました。そこで、今回は手元にある小銭の枚数から、特定の金額を支払うには、どのような組み合わせがあるのか調べるツールを作ってみましょう。

  • 硬貨の組み合わせを調べるプログラムを作ってみよう

    硬貨の組み合わせを調べるプログラムを作ってみよう

コインの組み合わせを調べるプログラムを作ろう

さて、今回は支払いに際して、手元にある異なる種類の硬貨を利用して、どのような支払いが可能なのかを調べるプログラムを作ってみましょう。

>【問題】
>  最初に簡単な例題を解いてみましょう。手元に500円玉が3枚、100円玉が5枚、50円玉が8枚あります。このコインから1450円を支払いたいとします。どのような組み合わせがあるのか、全ての組み合わせを表示してみてください。

どうでしょうか。読者の皆さん、答えを見ずにプログラムを作ることができるでしょうか。

この問題はプログラミングの基本的な構文をマスターしていれば解くことのできます。指定回数の繰り返しを行う「繰り返す」文、条件を確認する「もし・・・ならば・・・」文を組み合わせて問題を解きます。

次のようなプログラムで問題を解くことができます。なでしこ3の簡易エディタを開いて以下のプログラムを実行してみましょう。

# === 手元のお金と支払い額を指定 ===
枚数500=3
枚数100=5
枚数50=8
支払い額=1450
# === 組み合わせを計算 ===
I500を0から枚数500まで繰り返す
  I100を0から枚数100まで繰り返す
    I50を0から枚数50まで繰り返す
      合計額=I500×500+I100×100+I50×50
      もし、合計額=支払い額ならば
        「500円×{I500}+100円×{I100}+50円×{I50}={支払い額}」を表示。
      ここまで。
    ここまで。
  ここまで。
ここまで。

「実行」ボタンを押すと、以下のように答えが表示されます。

  • コインの組み合わせを調べるプログラムを実行したところ

    コインの組み合わせを調べるプログラムを実行したところ

このプログラムは、「繰り返し」文を使うことで、全ての組み合わせを調べることで成り立っています。人間だと全ての組み合わせを計算するのは大変なのですが、プログラムであれば一瞬です。

このプログラムに出てくる「I500」「I100」「I50」が繰り返し文で使う変数です。この変数が硬貨の枚数を意味しており、この値を1つずつ増加させながら全ての可能な硬貨の枚数の組み合わせを試します。

なお、大抵のプログラミング言語では、変数名には数字から始まる名前は使えません。なでしこでも「500円枚数」という変数名は使えないので「枚数500」という名前にしています。

プログラムの動きが分かりにくい場合

なお、プログラムの動きが分かりにくいと感じるなら、プログラムをより単純にして100円玉と50円玉だけに簡略化してみましょう。さらに「繰り返す」文の動きがよく分かるように「表示」を追加してプログラムの動きを可視化してみましょう。

以下のプログラムは、手元に100円玉が3枚、50円玉が6枚あったとき、支払い額が450円になる組み合わせを調べます。

# === 手元のお金と支払い額 ===
枚数100=3
枚数50=6
支払い額=450
# === 組み合わせを計算 ===
I100を0から枚数100まで繰り返す
  「--- 100円玉が{I100}枚の時 ---」と表示。
  I50を0から枚数50まで繰り返す
    合計額=I100×100+I50×50
    もし、合計額=支払い額ならば
      「🔵→100円×{I100}+50円×{I50}={合計額}」を表示。
    違えば
      「❌→100円×{I100}+50円×{I50}={合計額}」を表示。
    ここまで。
  ここまで。
ここまで。

同じように、なでしこ3簡易エディタでプログラムを実行してみましょう。

  • 2つの硬貨だけで試した場合

    2つの硬貨だけで試した場合

プログラムを実行すると、100円玉と50円玉の全ての組み合わせを計算して調べていることが分かるのではないでしょうか。

さらに繰り返しを単純にすると次のようになるでしょう。

枚数50=5
I50を0から枚数50まで繰り返す
  合計額=I50×50
  「50円×{I50}={合計額}」を表示。
ここまで。

どんな仕組みで動いているのか想像してみよう

ところで、最近のスーパーでは会計を行う機械が導入されていますね。紙幣を入れると自動的にお釣りをトレイに出金してくれるのでとても便利です。

こうした便利な機械がどのような仕組みで作られているのか想像したことがあるでしょうか?お釣り用の硬貨が現在何枚残っているのかをどうように調べているのでしょうか?また、その枚数を元にお釣り金額を求めるプログラムはどうなっているのでしょうか?お釣りの硬貨が少なくなってきたら、従業員の端末に通知が届くようにすると良いでしょうか?

このように、現実世界で動いている機器で、どのようなプログラムが動いているのか想像してみると面白いだけでなく、自分で何かプログラムを作る上でも役立つことでしょう。

まとめ

以上、今回は繰り返し文を利用して硬貨の組み合わせを調べるプログラムを作ってみました。コンピューターは繰り返しが得意です。人間だと面倒に感じるつまらない処理も喜んで計算してくれます。

もちろん、プログラム冒頭に書かれている変数の値を変更することで、任意の支払い額に応じた硬貨枚数の計算が可能です。プログラムを応用して硬貨の節約に活用してみてください。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。