スーパーや飲食店の会計時に、所持する硬貨の枚数が最低限となるように私は支払いをしている。それは、所持する硬貨の枚数が15枚を超えないことも意味する。
1円玉 | 4枚 |
5円玉 | 1枚 |
10円玉 | 4枚 |
50円玉 | 1枚 |
100円玉 | 4枚 |
500円玉 | 1枚 |
合計 | 15枚 |
※例えば、請求額が1円かつ硬貨を1枚も所持していない場合に千円札などの紙幣で支払うと、所持硬貨は上記の通り最大の15枚となる。
私の支払い方法をアルゴリズムで表現してみた。アルゴリズムという言葉を見ると、プログラミングや高度な数学の知識が必要と思うかもしれないがそんなことはない。アルゴリズムというのは目的を達成するための計算手順を示したものであり、料理で例えるならレシピに相当する物である。レシピに従い料理を作ることができるなら、アルゴリズムに従い計算をすることもできるだろう。
以下の支払いアルゴリズムに必要な数学能力は、1桁同士の足し算・足し算による繰上がり処理・数値比較が主である。2桁以上の足し算引き算を暗算する能力は不要である。プログラミング言語で使用されるような演算記号は極力使わないようにしたので、アルゴリズムを知らない人にこそ読んでほしい。
【支払い桁】 ← 1 /*硬貨支払いは1桁目から3桁目に対応するので、1~3の値をとる*/
【支払い総額】 ← 0 /*硬貨を支払うたびに加算する。実際には、置いた硬貨を数えるだけ*/
【請求額で見る数】 ← 0 /*下の桁から1桁ずつ見る。繰上がりもあるので、0~10の値をとる*/
【繰上がりフラグ】 ← 0 /*0:偽 1:真 とする*/
【請求額で見る数】 ← 【請求額】の【支払い桁】桁目の値+【繰上がりフラグ】
【繰上がりフラグ】 ← 0
(8)へ進む
【繰上がりフラグ】 ← 1
(8)へ進む
【請求額で見る数】×10^(【支払い桁】-1) に必要な 10^(【支払い桁】-1) 円玉を支払えるなら支払う。
【支払い総額】に支払った金額を加える
/*10^0=1 10^1=10 10^2=100 である*/
【請求額で見る数】×10^(【支払い桁】-1) に必要な 5×10^(【支払い桁】-1)円玉を支払えるなら支払う。
【支払い総額】に支払った金額を加える
/*5×10^0=5 5×10^1=50 5×10^2=500 である*/
【請求額で見る数】 > 【支払い総額】の【支払い桁】桁目の値 の場合
【繰上がりフラグ】 ← 1
【請求額】 > 【支払い総額】 かつ 【支払い桁】 < 3 の場合
【支払い桁】に1を加える
(2)へ戻る
硬貨支払いの終了
条件1 1円玉・10円玉・100円玉をそれぞれ4枚ずつ所持している
(1)請求額に876を設定。
(3)(4)該当せず。
(5)6に必要な1円玉を1枚支払い、支払い総額は1円となる。
(6)6に必要な5円玉を支払いたいが、所持してないので支払わない。
(7)1桁目に6円支払うべきところを1円しか支払っていないので、支払いは1桁上に繰上げ。
(8)支払い総額が請求額を満たしていないので、次は2桁目をみる → (2) へもどる。
(2)請求額で見る数は2桁目の7に繰上がりの1を加えて8である。
(3)(4)該当せず。
(5)80に必要な10円玉を3枚支払い、支払い総額は31円となる。
(6)80に必要な50円玉を支払いたいが、所持してないので支払わない。
(7)2桁目に80円支払うべきところを30円しか支払っていないので、支払いは1桁上に繰上げ。
(8)支払い総額が請求額を満たしていないので、次は3桁目をみる → (2) へもどる。
(2)請求額で見る数は3桁目の8に繰上がりの1を加えて9である。
(3)(4)該当せず。
(5)900に必要な100円玉を4枚支払い、支払い総額は431円となる。
(6)900に必要な500円玉を支払いたいが、所持してないので支払わない。
(7)3桁目に900円支払うべきところを400円しか支払っていないので、支払いは1桁上に繰上げ。
(8)支払い総額が請求額を満たしていないが、3桁目の支払いを終了したので該当せず。
(9)硬貨の支払いを終了する。
以上、硬貨の支払いは431円となる。ちなみに、876円の請求に1431円を支払うとお釣りは555円である。「876-1431=-555」の計算をせずとも支払いを最適化することができた。
人間は機械と違って、日常的動作は早く正確だが計算は遅くて間違いを起こすという特徴を持つ。どんなに計算が得意な人でもコンピュータより早く正確に計算をすることは不可能である(例外はジョン・フォン・ノイマンくらいであろう)。よって、人間の支払いにおいては、硬貨を支払う動作よりも計算自体がボトルネックやエラーの原因となると考えた。この問題の解決のために、1桁単位毎に硬貨を支払うようにした。
上記の支払いアルゴリズムに従えば、レジ店員のミスや釣銭不足の場合を除いて、硬貨の所持数を最低限にすることができる。しかし、緊急時に備えて硬貨を余分に所持しておきたいと考える人もいるだろう。その場合でも、支払いアルゴリズムを採用しないのはもったいない。なぜなら、アルゴリズムをほんの少し修正するだけでよいからだ。例えば100円玉を常に3枚以上持ち歩きたいなら、アルゴリズムの(5)に「支払いにより100円玉が2枚以下になるなら支払わない」という条件を追加すればよい。所持する100円玉は3~7枚の間を維持できる。他にも、各々の好みに合わせてアルゴリズムを修正して活用してほしい。