Python -常識の外側を見る-
今回も競技プログラミングについての発信(というか自分日記)を綴って行きたいと思います!
今回の問題はAtCoderBeginner 196のB問題
196のB問題
小数点以下を切り捨てて整数にして解く
最初僕は、mathのfloor関数を使って、小数点以下を切り捨てて、そこからint()で整数に戻す作戦をとった。
実際のコード
import math
x = float(input())
y = math.floor(x)
print(int(y))
vscode上では、問題ない!けど、コードを提出すると、【WA(間違っているよ)】と言われた。
「むむむ」思いの外難問・・・自分で考えても理由がわからなかったので、原因追求しました。
原因究明
今回も、うにさんの記事を参考にしました。
考察
入力を普通の数字として受け取って、int関数などで切り捨てようとすると壊れます。コンピュータが小数点のある数を扱うときに通常使う浮動小数点数では、桁数の大きい数を正確に表すことができないからです。
要するに、丸め込みする際に、差が生じちゃう?ってことなんかな?(わからん)
まぁ、「小数点以下が多すぎるとうまく四捨五入できないよ!」と言うことはわかった。
では、どーやって解くか?
今回の解き方
模範解答は「普通に読み込み【.】でsplit()して、左側を表示する」とのこと
ぐぁぁぁぁぁあああ!
完全に盲点。数字だから、少数と整数にしか考えつかなかった。恐ろしいのはこれがB問題だということ。これが本番だったらやばかった・・・
Atcoderの問題はA問題でもB問題でも、簡単に溶ける問題ばっかじゃないから汗
回答コード
ns = input().split(".")
print(ns[0])
レートが低いので、A問題とB問題は絶対落とせないので、これからは今までどうりC問題を中心に解きつつ、B問題もしっかりこなしていきたい。
この記事が気に入ったらサポートをしてみませんか?