Yukicoder081 すべて足すだけの簡単なお仕事です。

問題概要

与えられるN個の値の総和を求めよ。

$N\leqq10^2$、$-10^{10}\leqq a[i]\leqq10^{10}$、$a[i]$は小数点第10位まで与えられる。

yukicoder081

解法

桁落ちするので、小数点と整数部で分けて計算する。

計算量:$O(Nlog(a[i]))$

ソース

    #include <bits/stdc++.h>
    using namespace std;
    
    using VS = vector<string>;    using LL = long long;
    #define SZ(a) int((a).size())
    #define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)
    
    int main() {
        cin.tie(0);
        ios_base::sync_with_stdio(false);
    
        int N; cin >> N;
        VS vs(N);
        LL pA = 0, pB = 0;
        LL mA = 0, mB = 0;
        LL Base10 = 10000000000;
        FOR(i, 0, N) {
            cin >> vs[i];
            int pos = -1;
            int minus = 1;
            if (vs[i].front() == '-') {
                minus = -1;
                vs[i] = vs[i].substr(1);
            }
            FOR(j, 0, SZ(vs[i])) {
                if (vs[i][j] == '.')pos = j;
            }
            if (pos == -1) {
                pos = SZ(vs[i]);
                vs[i] += string(1, '.');
            }
            LL a = 0;
            FOR(j, 0, pos) {
                a *= 10;
                a += vs[i][j] - '0';
            }
            LL b = 0;
            vs[i] += string(15, '0');
            FOR(j, pos + 1, pos + 1 + 10) {
                b *= 10;
                b += vs[i][j] - '0';
            }
            if (minus == 1) {
                pA += a, pB += b;
                pA += pB / Base10;
                pB = pB % Base10;
            }
            else {
                mA += a, mB += b;
                mA += mB / Base10;
                mB = mB % Base10;
    
            }
        }
        // (+A.B) + (-A.B)
        LL ndiff = pA - mA;
        ndiff += -(pB - mB < 0);
    
    
        if (ndiff >= 0) {
            pB -= mB;
            if (pB < 0) {
                pB += Base10;
                mA++;
            }
            pA -= mA;
            printf("%lld.%010lld\n", pA, pB);
        }
        else {
            mB -= pB;
            if (mB < 0) {
                mB += Base10;
                pA++;
            }
            mA -= pA;
            printf("-%lld.%010lld\n", mA, mB);
        }
    
        return 0;
    }
Share Comments
̃Gg[͂ĂȃubN}[Nɒlj
comments powered by Disqus