ABC 169 C - Multiplication 3 にみる浮動小数点の取り扱い方

ABC 169 C - Multiplication 3の問題。

いいねが結構ついている記事 https://qiita.com/mod_poppo/items/910b5fb9303baf864bf7 を見たが、一番シンプルな実装が書かれていない。

int get_int2(int *a1, int *a2) {
  scanf("%d.%d", a1, a2);
  return 0;
}

単純に整数部分と、小数点部分で分離して数字を読み取れば良い。 計算するときは、

  1. (小数第2位と決まっているので、整数にするために)100倍する
  2. ans = A * Bの計算
  3. 答えansans/100として戻す。

つまり、

int64_t num = get_int();
int i, f;
get_int2(&i, &f);
int64_t ans = num * ((i*100)+f) / 100;

Note) 小数がからむ問題をすべて整数にして解く必要があるかというと、全くそういうことはない。大体の場合doubleのまま計算すればよい。この手の処理をしなければならないときは、四捨五入でなく、切り上げ、切り下げで答えを求める必要があり、答えを精確に求める必要がある場合(小数点〇〇桁までの精度という注意書きがない場合 or 誤差が許容されない場合)。

実装例: https://atcoder.jp/contests/abc169/submissions/13939660

例題

問題 方針 解答
パナソニックプログラミングコンテスト2020 C - Sqrt Inequality 2乗、式変形して、両辺整数の形に 解答
POJ 1064 Cable Master 整数にして、二分探索 解答

Cable Masterは蟻本 の中級編3-1にあります。