mery's Notes

めりーがプログラミングしたりします。

MENU

AtCoder Beginner Contest (ABC) 169 PythonでC問題解いてみた

前回の

mery-kirokudayo.hateblo.jp

こんにちは。メリーです。

あけましておめでとうございます。
今年もAtCoder続けていこうと思ってます。
今年中には水色くらいになりたいですね。(なお現在灰色)
モチベーション落とさずにやっていきたいです・・・。

今回はAtCoder Beginner Contest (abc) 169 のC問題解いていきます。

言語はPython、提出はPyPyです。

目次

C問題 Multiplication 3 余裕綽々編

Multiplication 3
問題文

C - 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個出た。

問題分を見た感じめっちゃ簡単そうなのに、誤差に関する知識が無いと解けない問題でした。
これが茶色の問題か・・・。

それでは!