見出し画像

ABC196 B 解答

B - Round Down (39)

問題文

整数または小数 X が与えられるので、小数点以下を切り捨てて整数で出力してください。

制約

・0 ≤ X ≤10^100
・X は整数、または小数点以下が 100桁以下の小数であり、先頭に余計な 0 は付かない

考察

型をうまく扱う問題ですね。これは言語によって可能な方針が異なると思います。本記事ではC++で可能な手法で解いています。

整数部のみを出力すればよいので、intのような整数型に入れて小数部を切り捨てればよい。と考えましたが、制約が大きいためその方法では解けません。だいたい、

int : 2.0 * 10^9
long long int : 9.0 * 10^18

ですので、10^100はダメそうですね。

そのため、数値型(整数型)ではなく、文字列を扱う string型で考えます。例えば「123.456」という入力でしたら、

ひゃくにじゅうさん てん よんごろく

ではなく、

いち に さん ピリオド よん ご ろく

のような感じで見ていきます。そうすることにより、ただ文字が並んでいるだけですので、整数部と小数部のようなややこしいことを考えなくてもよくなります。

求められる答えは、数値型の整数部ですので、string型の場合には「 . 」より左側となります。「出力は数値型」ということはありませんので、「.」に達するまで文字を順番に出力してあげましょう。このとき、「.」がなくても文字列の最後まで出力するだけですので、特に問題ありません。

実装


#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;

int main()
{
   string s;
   cin >> s;
   for(auto c:s)
   {
       if(c =='.') break;
       else cout << c;
   }
   cout << endl;
   return 0;
}

あとがき

ABCで時々問われる型の問題でした。数学とかアルゴリズムの勉強ばかりをしていると、このような問題に出くわした時に少しばかり面をくらってしまいます。本問題は文字列で処理すれば答えになりますので複雑ではないのですが、+0.05やround(.)で丸め込んでint(0.999...)を1にするなど、知っていないと悩んでしまうような問題もあります。普段、あまり意識しないからこそ、本問題のようなケースに出会ったときには、こういう細かな点の知識を少しずつ仕入れたいですね。

余談ですが、pythonだと

print(input().split(".")[0])

で答えになるそうですね。とっても美しくて好きです。

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