PAT 1081. Rational Sum

#include <cstdio>
#include <cstdlib>

using namespace std;

long long gcd(long long a, long long b) {
    long long r;
    while (r = (a % b)) {
        a = b;
        b = r;
    }
    return b;
}

int main() {

    int N;
    scanf("%d", &N);
    long long sa = 0, sb = 1, a, b;
    
    for (int i=0; i<N; i++) {
        scanf("%lld/%lld", &a, &b);
        long long newb = b * sb / gcd(b, sb);
        long long sf =  newb / sb;
        long long cf =  newb / b;
        sa = sa * sf + a * cf;
        sb = newb;
        long long c = gcd(sa < 0 ? -sa : sa, sb);
        sa = sa/c;
        sb = sb/c;
    }
    
    if (sa < 0) {
        printf("-");
        sa = -sa;
    }
    long long r = sa % sb;
    long long q = sa / sb;
    if (r == 0) {
        printf("%lld\n", q);
    } else {
        if (q != 0) {
            printf("%lld ", q);
        }
        printf("%lld/%lld\n", r, sb);
    }
    
    return 0;
}

还好数值范围没有超

posted @ 2014-11-26 23:36  卖程序的小歪  阅读(137)  评论(0编辑  收藏  举报