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
輾轉相除法求最大公約數。
/*2015.7.30cyq*/
#include <iostream>
#include <string>
using namespace std;
long gcd(long a,long b){//輾轉相除求最大公約數
long r;
while(b!=0){
r=a%b;
a=b;
b=r;
}
return a;
}
void add(long &a,long &b,long &a1,long &b1){
long flag=1;
long num=a*b1+a1*b;
long den=b*b1;
if(num<0){
flag=-1;
num=-num;
}
long g=gcd(num,den);
a=flag*num/g;
b=den/g;
}
int main(){
int N;
cin>>N;
long a1,b1,a,b;
scanf("%ld/%ld",&a,&b);
for(int i=1;i<N;i++){
scanf("%ld/%ld",&a1,&b1);
add(a,b,a1,b1);
}
if(a==0){
printf("0");
return 0;
}
if(b==1){
printf("%ld",a);
return 0;
}
if(a/b){//整數部分
printf("%ld ",a/b);
a=a%b;
}
printf("%ld/%ld\n",a,b);
return 0;
}