問題概要
与えられるN個の値の総和を求めよ。
$N\leqq10^2$、$-10^{10}\leqq a[i]\leqq10^{10}$、$a[i]$は小数点第10位まで与えられる。
解法
桁落ちするので、小数点と整数部で分けて計算する。
計算量:$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; }