1. 程式人生 > >1081 Rational Sum(20 分)(C++)

1081 Rational Sum(20 分)(C++)

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

考點:最簡分數化簡

#include<iostream>
#include<cstdio>
using namespace std;
long long gcd(long long a, long long b) {
    return b == 0 ? abs(a) : gcd(b, a % b);
}
int main(){
    long long a,b,sum=0,suma=0,sumb=1;
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%lld/%lld",&a,&b);
        if(a/b!=0){
            long long x=a/b;
            sum+=x;
            a=a%b;
        }
        long long p=gcd(b,a);
		    a/=p;
		    b/=p;
        suma=suma*(b)+a*(sumb);
        sumb=sumb*b;
        if(suma/sumb!=0){
            long long x=suma/sumb;
            sum+=x;
            suma=suma%sumb;
        }
		 p=gcd(sumb,suma);
		 suma/=p;
		 sumb/=p;
    }
    if(sum!=0||suma==0)
        printf("%lld",sum);
    if(sum!=0&&suma!=0)
        printf(" ");
    if(suma!=0)
        printf("%lld/%lld",suma,sumb);
	system("pause");
}