给出 N 个分数,求它们的总和。
输入第一行给出一个正整数 N,表示输入的分数总数。输入第二行给出 N 个分数。
在一行中输出这 N 个分数的总和。
#include <bits/stdc++.h>
using namespace std;
using gg = long long;
gg gcd(gg a, gg b) { return b == 0 ? a : gcd(b, a % b); }
using F = array<gg, 2>;
F input() {
F f;
char c; //吸收'/'符号
cin >> f[0] >> c >> f[1];
return f;
}
void simplify(F& f) {
if (f[0] == 0) { //如果分子 f[0] 为 0,则令 f[1]=1
f[1] = 1;
return;
}
if (f[1] < 0) { //如果分母 f[1] 为负,将分子 f[0] 和分母 f[1] 都取相反数
f[1] = -f[1];
f[0] = -f[0];
}
gg d = gcd(abs(f[0]),
abs(f[1])); //求出分子 f[0] 和分母 f[1] 绝对值的最大公约数
f[0] /= d;
f[1] /= d;
}
F Plus(const F& f1, const F& f2) {
F f;
f[0] = f1[0] * f2[1] + f2[0] * f1[1];
f[1] = f1[1] * f2[1];
simplify(f);
return f;
}
void output(const F& f) {
if (f[0] < 0)
cout << '(';
if (f[1] == 1) {
cout << f[0];
} else if (abs(f[0]) < f[1]) {
cout << f[0] << "/" << f[1];
} else
cout << f[0] / f[1] << " " << abs(f[0]) % f[1] << "/" << f[1];
if (f[0] < 0)
cout << ')';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
gg ni;
cin >> ni;
F ans{0, 1};
while (ni--) {
ans = Plus(ans, input());
}
output(ans);
return 0;
}