torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

AtCoder Beginner Contest 169, C : Multiplication 3

問題概要

 整数 $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;
}