1081 Rational Sum (PAT甲级)

#include 
#include 

int N;
long a, b;
long long numerator, denominator, integer;

long long gcd(long long c, long long d){
    return c == 0 ? d : gcd(d % c, c);
}

void calSum(long c, long d){
    numerator = numerator * d + denominator * c;
    denominator = denominator * d;
    long long tmp = abs(gcd(numerator, denominator));
    numerator /= tmp;
    denominator /= tmp;
}

int main(){
    scanf("%d", &N);
    numerator = 0;
    denominator = 1;
    for(int i = 0; i < N; ++i){
        scanf("%ld/%ld", &a, &b);
        calSum(a, b);
    }
    if(numerator < 0){
        printf("-");
        numerator = -numerator;
    }
    integer = numerator / denominator;
    if(integer > 0){
        printf("%lld%s", integer, numerator % denominator > 0 ? " " : "");
    } else if(numerator % denominator == 0){
        printf("0");
        return 0;
    }
    numerator %= denominator;
    if(numerator > 0){
        printf("%lld/%lld", numerator, denominator);
    }
    return 0;
}

题目如下:

Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum.

Input Specification:

Each input file contains one test case. Each case starts with a positive integer N (≤100), followed in the next line N rational numbers a1/b1 a2/b2 ... where all the numerators and denominators are in the range of long int. If there is a negative number, then the sign must appear in front of the numerator.

Output Specification:

For each test case, output the sum in the simplest form integer numerator/denominator where integer is the integer part of the sum, numerator < denominator, and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.

Sample Input 1:

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

Sample Output 1:

3 1/3

Sample Input 2:

2
4/3 2/3

Sample Output 2:

2

Sample Input 3:

3
1/3 -1/6 1/8

Sample Output 3:

7/24

你可能感兴趣的:(PAT甲级,pat考试)