BOJ 2720号クリーニング店社長東赫派森.


これは単純な青銅問題であり,浮動小数点タイプ計算時に生じる誤差のため,多くの時間を費やした.

質問する


米国に留学している東赫はクリーニング店を経営している.最近、アルバイトのために高校生の李岩を雇った.
東赫は李岩に失望した.
リオンはいつもお金を間違えている.
甚だしきに至っては $0.5ドルをください.小銭を使ってもいいです. $5ドルあげる!
優れたコーディング能力を発揮してリオンを助けるプログラムを書かなければならないが、DIA blowなのでコーディングする時間がないので、この問題を読んでいる友达は彼の代わりにしなければならない.
小銭の額があれば、リオンが与えるべき割当額(Quarter、 $0.25)個、Daim(Dime, $0.10個、ニッケル(Nickel, $0.05)個数,Penny(Penny, $個数を求めるプログラムを作成してください.探しているお金はいつも $5.00以下で、お客様が受け取るコインの数をできるだけ減らします.たとえば、 $1.24を探せば、4クォーター、2ダム、0ニッケル、4ペンスがもらえます.

入力


第1行は、試験例の個数Tを与える.各テストボックスは整数で構成され、おつりCを表します.Cの単位はセントです.(1ドル=100セント)(1<=C<=500)

しゅつりょく


各試験盤キャビネットについて、必要な割当額の個数、Daimの個数、ニッケルの個数、Pennyの個数をスペースで区切って出力します.

リオンが与えるコイン(クォート、ダム、ニッケル、ペニー)はfloatに比べて、小銭Cはドルではなく整数です.
問題に示すように、1ドルは100セントなので、お釣りCを受け取って、この値を100で割って計算したいです.
しかし、出力例では、最後の4が3まで撮られている.
4 2 0 4 3
1 0 0 0
7 1 1 4 3
だから真ん中に印刷するときはまず大金を探して0.4が残ったときは0.39999999.9.同じ値段がある.
もともとfloatの浮動小数点誤差の問題だった.
計算機は2進数で表されるので、分かりやすい10進数を表す場合、正確でなくても近似値で表すことができます.これはこの数字に非常に近いが、全く同じではない.
例えば、10進数の0.1を表す場合、実際には0.1000000000000000055511151231257827021181583404541015625である.
しかし、このような直接表現に比べてPythonは十進法近似値を表している.
したがって、0.4が現れるべきである場合、0.3999999は概ねこのような値である.
解決策としては、最初から割当額、Daim、ニッケル、Pennyに100を乗じた値(いずれにしても入力値の小銭もセントで入力される)を持つか、Decimalを導入する方法がある.
後者を使用するときに注意したいのは、Decimal()にパラメータを入れるときにstrタイプを入れることです.

コイン値をfloatではなくintとして最初から受け入れる方法

T = int(input())

cng =[25,10,5,1]
for _ in range(T):
    C = int(input())

    for i in range(len(cng)):
        num = C // cng[i]
        print(num, end=' ')
        C -= num * cng[i]

    print()

Decimalを使用して浮動小数点を正確にマークする方法。

from decimal import Decimal

T = int(input())

C = [0.25,0.10,0.05,0.01]

for _ in range(T):
    total = int(input())
    total /=100

    for i in range(len(C)):
        coin = Decimal(str(C[i]))
        change = Decimal(str(total)) // coin
        print(change, end=' ')
        total  = Decimal(str(total)) - change * coin

    print()

上はDecimal下はint