見出し画像

Python -常識の外側を見る-

今回も競技プログラミングについての発信(というか自分日記)を綴って行きたいと思います!

今回の問題はAtCoderBeginner 196のB問題

196のB問題

画像1

小数点以下を切り捨てて整数にして解く

最初僕は、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問題もしっかりこなしていきたい。

この記事が気に入ったらサポートをしてみませんか?