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/3Sample Output 1:
3 1/3Sample Input 2:
2 4/3 2/3Sample Output 2:
2Sample Input 3:
3 1/3 -1/6 1/8Sample Output 3:
7/24
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
struct Rational{
long nume;
long deno;
bool negative;
Rational(long n = 0, long d = 1){
negative = (n < 0) ^ (d < 0);
nume = abs(n);
deno = abs(d);
}
Rational& operator += (const Rational& rhs){
long d = deno;
nume *= rhs.deno;
deno *= rhs.deno;
long nrhs = rhs.nume * d;
if(negative) nume = -nume;
if(rhs.negative) nrhs = -nrhs;
nume += nrhs;
negative = (nume < 0);
nume = abs(nume);
long gcd = __gcd(nume, deno);
nume /= gcd;
deno /= gcd;
return *this;
}
};
int main(){
int n;
scanf("%d", &n);
Rational sum;
for(int i = 0; i < n; ++i){
long n, d;
scanf("%ld%*c%ld", &n, &d);
sum += Rational(n, d);
}
if(sum.nume == 0){
printf("0");
}else{
if(sum.negative) printf("-");
if(sum.deno == 1){
printf("%ld", sum.nume);
}else{
if(sum.nume > sum.deno){
printf("%ld %ld/%ld", sum.nume / sum.deno, sum.nume % sum.deno, sum.deno);
}else{
printf("%ld/%ld", sum.nume, sum.deno);
}
}
}
return 0;
}