Skip to content

L1-009 N个数求和

Statement

Metadata

  • 作者: 陈越
  • 单位: 浙江大学
  • 代码长度限制: 16 KB
  • 时间限制: 400 ms
  • 内存限制: 64 MB

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式

输入第一行给出一个正整数N\le100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1

5
2/5 4/15 1/30 -2/60 8/3

输出样例1

3 1/3

输入样例2

2
4/3 2/3

输出样例2

2

输入样例3

3
1/3 -1/6 1/8

输出样例3

7/24

Solution

#include <ctype.h>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;
typedef long long LL;

const double PI = 3.14159265358979323846264338327;
const double E = 2.718281828459;
const double eps = 1e-6;

const int MAXN = 0x3f3f3f3f;
const int MINN = 0xc0c0c0c0;
const int maxn = 1e5 + 5;
const int MOD = 1e9 + 7;

LL gcd(LL x, LL y) {
    LL r;
    while (1) {
        r = x % y;
        if (r == 0)
            break;
        x = y;
        y = r;
    }
    return y;
}

int main() {
    int n;
    cin >> n;
    LL a, b, c, d;
    scanf("%lld/%lld", &a, &b);
    for (int i = 1; i < n; i++) {
        scanf("%lld/%lld", &c, &d);
        LL temp = b * d / gcd(b, d);
        a *= (temp / b);
        a += (c * (temp / d));
        b = temp;
        temp = gcd(a, b);
        a /= temp;
        b /= temp;
    }
    LL vis = a / b;
    a %= b;
    if (vis) {
        printf("%lld", vis);
        if (a) {
            if (vis < 0 && a > 0)
                a *= -1;
            printf(" %lld/%lld", a, abs(b));
        }
    } else if (a) {
        if (b < 0 && a > 0)
            a *= -1, b *= -1;
        printf("%lld/%lld", a, abs(b));
    } else
        cout << 0;
    cout << endl;
}

Last update: May 4, 2022
Back to top