AtCoder Beginner Contest (ABC) 169 PythonでC問題解いてみた
前回の
こんにちは。メリーです。
あけましておめでとうございます。
今年もAtCoder続けていこうと思ってます。
今年中には水色くらいになりたいですね。(なお現在灰色)
モチベーション落とさずにやっていきたいです・・・。
今回はAtCoder Beginner Contest (abc) 169 のC問題解いていきます。
言語はPython、提出はPyPyです。
目次
C問題 Multiplication 3 余裕綽々編
Multiplication 3
問題文
A×Bを小数点切り捨てで出力してください。
という問題。
これでdifficultyが597もあるんですか???
茶色の人も結構解けない問題なんですか???
こんなの方針を立てるまでも無いですね。
以下のコードで提出しました。
a, b = map(float,input().split()) c = a*b print(int(c))
簡単ですね。
余裕のよっちゃんです。
WAが5個出ました。
なんでや。
intが悪いんか???
そう思い、math.floorを試しました。
WAが5個出ました。
おかしい。
割り算なら誤差が出ることもある(割り切れない時とか)。
けど、掛け算だから誤差出ないはずなのに・・・。
C問題 Multiplication 3 余裕崩壊編
というわけで、解説を見ることに。
参考にした解説
Multiplication 3 [AtCoder Beginner Contest 169 C] - はまやんはまやんはまやん
floatで掛け算しても、誤差は出るらしい。
なんだって!!!
なので、floatを使わない方法(整数)で計算することで、誤差を無くせるとのこと。
というわけで、Bを100倍してAと掛け算しよう!!
というのが、この問題のミソ。
ACしたコードがこちら
a, b = input().split() b1,b2 = b.split(".") ans = int(a) * (int(b1)*100 + int(b2)) print(ans//100)
Bを100倍にする時に整数部と小数部に分けて整数部を100倍してから足すのがポイント
これを分けずにそのまま100倍すると、floatでの計算となるので誤差が発生する。
※実際にそのまま100倍にしたらWAが1個出た。
問題分を見た感じめっちゃ簡単そうなのに、誤差に関する知識が無いと解けない問題でした。
これが茶色の問題か・・・。
それでは!