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; }
単純に整数部分と、小数点部分で分離して数字を読み取れば良い。 計算するときは、
- (小数第2位と決まっているので、整数にするために)100倍する
ans = A * B
の計算- 答え
ans
にans/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にあります。