はまやんはまやんはまやん

hamayanhamayan's blog

電卓 [第四回 アルゴリズム実技検定 B]

https://atcoder.jp/contests/past202010-open/tasks/past202010_b

解説

https://atcoder.jp/contests/past202010-open/submissions/21465680

まず、Y=0の時はゼロ除算となるので、指定のERRORを出して答えよう。
競プロの問題ではこのようなコーナーケースが存在する場合がある。
今回は問題に明記してあったが、そうでない場合は自分で見つけて、場合分けする必要がある。

本題

小数で表示せよという問題である。
問題にある通りの動作を行って小数で表示しても2桁くらいなら問題無さそうな気もするが、
より確実な方法を取ることにする。

プログラムは内部表現上の問題で正確な小数表現というのが多くの場合で行えない。
よって、整数的に計算ができる場合は整数に置き換えて計算することが望ましい。
「X/Yの小数点3桁切り捨て」というのは100倍することで「100X/Yの小数点以下切り捨て」という風に整数上の問題に変換できる。
これはもっと別の言い方をすると「100XをYで割った商」という言い方もでき、完全に小数成分がなくなった。
よって、これを計算して、出力時はその結果をさらに100で割った商が整数部、余りが小数部になるので、分解して答える。

『プログラムは内部表現上の問題で正確な小数表現というのが多くの場合で行えない』

言語や処理系によって差はあるが、詳しく知りたい場合は以下キーワードが役立つだろう。

int X, Y;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> X >> Y;

    if (Y == 0) {
        cout << "ERROR" << endl;
        return;
    }

    int ans = X * 100 / Y;
    printf("%d.%02d\n", ans / 100, ans % 100);
}