質問: min(a-1, n-b) + 1 + (b-a-1)//2 print(ans) ``` 上記のお題はAtCoderの「AtCoder Grand Contest 041」のA「Table Tennis Training」です。
回答: 編集後のご質問の主文 ***違う結果が出力される場合はどのようなときなのでしょうか?*** だけに限っての回答ですが。 ちなみに、***上記のお題はAtCoderの「AtCoder Grand Contest 041」のA「Table Tennis Training」です。*** といった情報は最初からご質問に含めておいた方が良いでしょう。 出題中にこんな制約があります。 * 2≤N≤1018 * 1≤A500000000000000000 ans = (b-a)//2 print(ans) #->499999999999999999 ``` Pythonの`float`型は64ビットの浮動小数点数で、10進換算で15〜16桁の精度しかなく、`499999999999999999`のような18桁ある整数値を正確に表すことができません。従って、計算結果を`float`型に変換する`/`除算では結果を正確に表すことができない訳です。 出題に「1018」なんて値が設定してあるのには、単にループや再帰などを使った繰り返し型の回答を排除するだけでなく、**途中計算に`float`型を使うと正しい結果が得られない** ように設定したかったのだろうと思われます。