この記事で紹介するオリジナル問題
問題文
0以上100000以下の有理数、a
、b
、c
が与えられます。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
このように出力されます。
ここまで読んでくれてありがとうございます!
ぜひ、「いいね」と「フォロー」をお願いします。