1081. Rational Sum (20)
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 <cstdio>
#include <iostream>
using namespace std;
//
//1.remember that the input asures the demoninator is a possitive integer,so
//no need to deal with the case
//2.the simplest form of -10/3 is -3 -1/3 not -3 1/3
//3.when calculate mygcd,make sure numerator is nonzero
long long mygcd(long long a,long long b){
if(a < 0)
a = -a;
// if(b < 0)
// b =-b;
if(a > b){
int tmp=a;
a=b;
b=tmp;
}
while(b%a !=0){
int tmp=b%a;
b =a;
a = tmp;
}
return a;
}
void add(long long &numerator1,long long &denominator1,long long &numerator2,long long &denominator2){
int factor;
if(numerator2 !=0){
factor = mygcd(numerator2,denominator2);
numerator2 /=factor;
denominator2 /=factor;
}
numerator1 = numerator1*denominator2+numerator2*denominator1;
denominator1 = denominator1*denominator2;
if(numerator1 == 0){ //if numerator1 is zero, return
denominator1 = 1;
return ;
}
factor = mygcd(numerator1,denominator1);
numerator1 = numerator1/factor;
denominator1 = denominator1/factor;
}
int main()
{
int times;
long long numerator1,denominator1,numerator,denominator;
scanf("%d",×);
scanf("%lld/%lld",&numerator1,&denominator1);
for(int i=0;i<times-1;i++){
scanf("%lld/%lld",&numerator,&denominator);
add(numerator1,denominator1,numerator,denominator);
}
if(denominator1 == 1) //integer part no fraction part including zero
cout <<numerator1 <<endl;
else{
if(numerator1 > denominator1 || (-numerator1) > denominator1) //integer part plus fraction part
cout <<numerator1/denominator1 <<' ' <<numerator1%denominator1 <<'/' <<denominator1 <<endl;
else //only fraction part
cout <<numerator1 <<'/' <<denominator1 <<endl;
}
return 0;
}