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<stdio.h>
#include<math.h>
const int maxn=105;
struct fraction{
int up;
int down;
fraction(){
up=0;down=1;
}
}f[maxn];
int gcd(int a,int b){
if(b==0) return a;
else return gcd(b,a%b); //顺序不能反了
}
fraction reduction(fraction result){
if(result.down<0){
result.up=-result.up;
result.down=-result.down;
}
if(result.up==0)
result.down=1;
else{
int d=gcd(abs(result.up),abs(result.down));
result.up/=d;
result.down/=d;
}
return result;
}
fraction add(fraction a,fraction b){
fraction result;
result.up=a.up*b.down+a.down*b.up;
result.down=a.down*b.down;
return reduction(result);
}
int main(){
int n,up,down;
fraction result,temp;
scanf("%d",&n);
while(n--){
scanf("%d/%d",&up,&down);
temp.up=up;
temp.down=down;
result=add(temp,result);
}
int d=result.up/result.down;
if(result.down==1){
printf("%d",result.up);
return 0;
}
else if(d!=0){
printf("%d ",result.up/result.down);
}
printf("%d/%d",result.up-result.down*d,result.down);
return 0;
}