PAT 天梯赛 L1-009 N个数求和

模拟题

题目链接

题解

每次将两个分数进行相加,到最后再将结果化成带分数。主要考察的最大公约数与最小公倍数。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 110;
int n;
struct Fraction {
    long long a,b;
}f[maxn];

long long _gcd(long long a, long long b) {
    if(b == 0) return a;
    else return _gcd(b, a%b);
}
long long _lcm(long long a, long long b) {
    long long c = _gcd(a,b);
    return a/c*b;
}
Fraction _add(Fraction A, Fraction B) {
    long long lcm = _lcm(A.b, B.b);
    A.a = (lcm/A.b)*A.a;
    B.a = (lcm/B.b)*B.a;
    A.a += B.a;
    A.b = lcm;
    long long gcd = _gcd(abs(A.a), A.b);
    A.a /= gcd;
    A.b /= gcd;
    return A;
}
void _output(Fraction ans) {
    long long gcd,x;
    gcd = _gcd(abs(ans.a), ans.b);
    ans.a /= gcd;
    ans.b /= gcd;
    x = ans.a / ans.b;
    ans.a %= ans.b;
    if(x == 0 && ans.a == 0)printf("0\n");
    else if(x && ans.a == 0) {
        printf("%lld\n", x);
    }else if(x == 0 && ans.a) {
        printf("%lld/%lld\n", ans.a, ans.b);
    }else {
        printf("%lld %lld/%lld\n", x, ans.a, ans.b);
    }
}
int main() {
    while(~scanf("%d", &n)) {
        Fraction ans;
        scanf("%lld/%lld", &ans.a, &ans.b);
        for(int i = 1; i < n; i++) {
            scanf("%lld/%lld", &f[i].a, &f[i].b);
            ans = _add(ans, f[i]);
        }
        _output(ans);
    }
    return 0;
}
posted @ 2016-05-16 16:28  yinzm  阅读(472)  评论(0编辑  收藏  举报