Skip to content

Latest commit

 

History

History
72 lines (65 loc) · 1.57 KB

1081. Rational Sum.md

File metadata and controls

72 lines (65 loc) · 1.57 KB

【PAT A-1081】Rational Sum

题意概述

给出 N 个分数,求它们的总和。

输入输出格式

输入第一行给出一个正整数 N,表示输入的分数总数。输入第二行给出 N 个分数。

在一行中输出这 N 个分数的总和。

C++代码

#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;
}