:heavy_check_mark: test/Math/digits_base_10/aoj-0002.cpp

Depends on

Code

// competitive-verifier: PROBLEM https://onlinejudge.u-aizu.ac.jp/problems/0002

#include "Math/digits_base_10.hpp"
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF)
    {
        cout << digits_base_10(a + b) << endl;
    }
}
#line 1 "test/Math/digits_base_10/aoj-0002.cpp"
// competitive-verifier: PROBLEM https://onlinejudge.u-aizu.ac.jp/problems/0002

#line 1 "Math/digits_base_10.hpp"
#include <bits/stdc++.h>
using namespace std;

int digits_base_10(unsigned long long x)
{
    if (x == 0)
    {
        return 1;
    }

    // 最上位ビットがnの最大値の時の桁数(0は一桁とする)
    const int log10_table_by_bit[] = {1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20};

    // 10^n
    const unsigned long long pow10s[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, 1000000000000000, 10000000000000000, 100000000000000000, 1000000000000000000, 10000000000000000000ull};

    int upper_digits = log10_table_by_bit[bit_width(x)];
    return upper_digits - (x < pow10s[upper_digits - 1]);
};
#line 5 "test/Math/digits_base_10/aoj-0002.cpp"

using namespace std;

int main()
{
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF)
    {
        cout << digits_base_10(a + b) << endl;
    }
}

Test cases

Env Name Status Elapsed Memory
g++ judge_data :heavy_check_mark: AC 5 ms 3 MB
Back to top page