2
2

【クソ問題】みなさんはこんな問題が出たらどうしますか?

Posted at

この記事で紹介するオリジナル問題

問題文

0以上100000以下の有理数abcが与えられます。a+b=cになる場合はYesを、そうでなかったらNoを出力しなさい。

入力

a b c

WAのコード

a, b, c = map(float, input().split()) # a,b,cという変数に半角区切りで入力をfloat型で受け取る
if a + b == c:
    print("Yes") # もしa+b=cだったらYesと出力
else:
    print("No")  # もしそうでなかったらNoと出力

一見あってそうに見えますよね。何が違うのでしょうか?

解説と理由

WAになるサンプルケース

次のような入力を考えてみましょう。

0.1 0.2 0.3

この入力で先ほどのコードを実行してみてください。すると、不思議なことに、

No

と返ってきますよね?

ここで「まさか」と思う人も多いはずです。だって0.1+0.2=0.3ですよ。

コンピューターの弱点

コンピューターは2進数で計算します。すると、ほとんどの小数は2進数で正確に表せないのです。そのため、誤差が生じてしまいこうなります。そのため、Pythonのdecimalとか使うといいでしょう。

みんな大好きエクセルでも...

みんな大好きエクセルでもこのような現象は起きてしまう...2進数はこれが難しいです。

ACコードは?

これです!

from decimal import *

a, b, c = map(float, input().split())
if Decimal(str(a)) + Decimal(str(b)) == Decimal(str(c)):
    print("Yes")
else:
    print("No")

このDecimalを入れることで、10進数で計算してくれます。すると、誤差はなくなるので、

Yes

このように出力されます。


ここまで読んでくれてありがとうございます!

ぜひ、「いいね」と「フォロー」をお願いします。

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2