今日勉強したことを
つらつらと
logo

abc165_cの解き方の解説 C++で整数をそのまま表示する方法 小数も

2020/05/20 23:05
AtCoder Beginner Contest 159のC問題を解く

感謝の正拳突き1万回ならぬ、競プロサイトで 1 日 1AC(正解)するように頑張る。

今日はAtCoder Beginner Contest 165 の C 問題です。

同じ C 問題でも(昨日の 165 の C 問題)[/2020191ac]と比べるとやけに簡単なような・・? 入力例 1 の解説のとおり立方体が一番体積が大きくなるので、L を 3 で割れば AC。ループもないし簡単すぎて不安になった。

#include <bits/stdc++.h>
using namespace std;
double l;
int main() {
    cout << fixed << std::setprecision(20);
    cin >> l;
    l /= 3;
    cout << l * l * l;
}

おまじない

C++で数学系の問題のときは、おまじないとして次のコードをつけるのが競プロ専用の普段役に立たないノウハウ。float や double などの浮動小数点型の場合、桁が非常に大きいか小さい場合に指数表記になってしまうが、(std::fixed)[https://cpprefjp.github.io/reference/ios/fixed.html]を渡すと指数表記ではなくなる。デフォルトの表示制度は小数点以下 6 位なので、std::setprecision(n)で桁数を設定できる。

cout << fixed << std::setprecision(20);
#include <bits/stdc++.h>
using namespace std;

int main() {
    // 何も指定しないと指数表記になる
    for(double i = 0.000000001; i <= 100000000000000000; i *= 10)
        cout << i << endl;

    // fixedを渡しておくと、指数表記にならなくなるが、小数点6位までしか表示されない
    cout << fixed;
    for(double i = 0.000000001; i <= 100000000000000000; i *= 10)
        cout << i << endl;

    // setprecisionしておくと、表示する桁数が増える。浮動小数点型の精度が上がるわけではない。
    cout << std::setprecision(20);
    for(double i = 0.000000001; i <= 100000000000000000; i *= 10)
        cout << i << endl;
}

© 2021 simodake