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 (≤), 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<cstdio> #include<algorithm> using namespace std; typedef long long ll; struct Fraction{ ll up,dowm; }; ll gcd(ll a,ll b){ return b == 0 ? a : gcd(b,a%b); } Fraction reduction(Fraction result){ if(result.dowm < 0){ result.up = - result.up; result.dowm = - result.dowm; } if(result.up == 0){ result.dowm = 1; }else{ int d = gcd(abs(result.dowm),result.up); result.dowm /= d; result.up /= d; } return result; } Fraction add(Fraction f1,Fraction f2){ Fraction result; result.up = f1.dowm*f2.up + f2.dowm*f1.up; result.dowm = f1.dowm*f2.dowm; return reduction(result); } void showResult(Fraction r){ reduction(r); if(r.dowm == 1) printf("%lld",r.up); else if(abs(r.up) > abs(r.dowm)){ printf("%lld %lld/%lld",r.up/r.dowm,r.up%r.dowm,r.dowm); }else{ printf("%lld/%lld",r.up,r.dowm); } } int main(){ int n; scanf("%d",&n); Fraction sum,temp; sum.up = 0, sum.dowm = 1; for(int i = 0; i < n; i++){ scanf("%lld/%lld",&temp.up,&temp.dowm); sum = add(sum,temp); } showResult(sum); return 0; }