A - Batting Average Editorial by cirno3153

制約が大きくても誤差無く出力する方法

この問題を誤差無く求めるためには、実数を経由せずに整数のまま扱うと良いです。

そこで、まずは答えを \(1000\) 倍したものを求めてみましょう(これは整数です)。

答えを \(1000\) 倍する場合、 \(\frac{1000B}{A}\) の小数第一位を四捨五入する問題となります。 これは \(\frac{1000B}{A} + 0.5\) の小数第一位を切り捨てれば良く、 \(\frac{\frac{10000B}{A} + 5}{10}\) の小数第一位を切り捨てる、とすると整数のみの演算を用いて表せます。 また、標準的なプログラミング言語では整数の割り算では自動的に小数第一位が切り捨てられることから、上の式を実装することで答えの \(1000\) 倍が求まりました。

最後に、出力を考えます。

答えの \(1000\) 倍を \(X\) とすると、まず \(X\)\(4\) 桁目以降を出力し、次に.を出力し、最後に \(X\) の下 \(3\) 桁を出力します。

\(X\)\(4\) 桁目以降は \(\frac{X}{1000}\) の端数切捨てで求まり、 下 \(3\) 桁は \(X\)\(1000\) で割った余りとなることから、これを出力します。

A, B = map(int, input().split()) # AとBを入力として受け取る
X = (10000 * B // A + 5) // 10 # 答えの1000倍を求める
print("{}.{:03d}".format(X // 1000, X % 1000)) # 4桁目以降と下3桁を、"."を区切りで出力する ここで{:03d}は3桁0埋めをしてくれる命令

posted:
last update: