問題概要
整数 $N$ と実数 $B$ が与えられる.$A \times B$ の整数部分を出力せよ.なお,$B$ は小数点以下第 2 位まで与えられる.
制約
- $0 \leq A \leq 10^{ 15 }$
- $0 \leq B < 10$
解法
普通に計算をすれば通りそうに見えますが,現実の計算機上で実数を扱う場合は誤差がつきものなので,できれば整数の範囲で処理をしたいです.この問題の場合,$B$ の小数点以下の表示桁数が固定であることから,$B$ の表示の小数点を消去した文字列を整数として読んだ値は $100 B$ となります.$A \times 100 B$ という値を考えると,$A \times 100 B$ の下 2 桁は,$A \times B$ の小数部分に対応します.よって,$A \times 100 B$ を $100$ で(整数の除算の意味で)割ってこの部分を消し去ることで,欲しかった値が求まります.
C++ での実装面では,$B$ を整数や実数として受け取らずに std::string として受け取ってから 2 文字目のピリオドを消し,std::istringstream などで整数に変換すると自分で実装する部分を少なめにできます.
コード
int main() { IN( LL, A ); IN( string, S ); S.erase( 1, 1 ); std::istringstream iss( S ); int B; iss >> B; cout << A * B / 100 << endl; return 0; }