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:
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.
IDEA
1.主要最终/中间结果为0 的情况,则不用化简,找最大公约数,而是将结果直接赋值与初始化
CODE
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
struct Num{
long long a;
long long b;
};
long long comm_divisor(Num num){
long long r,min,max;
min=(num.a>num.b)?num.b:num.a;
max=(num.a>num.b)?num.a:num.b;
r=max%min;
while(r){
max=min;
min=r;
r=max%min;
}
return min;
}
void simple(Num &num){
long long div=comm_divisor(num);
num.a/=div;
num.b/=div;
}
void output(Num num){
int flag=0;
if(num.a<0){
num.a=-num.a;
flag=1;
}
if(num.a==0){
printf("0");
}else{
long long c,d;
c=num.a/num.b;
d=num.a%num.b;
if(flag){
if(d==0){
printf("-%lld",c);
}else{
if(c==0){
printf("-%lld/%lld",num.a,num.b);
}else{
printf("-%lld %lld/%lld",c,d,num.b);
}
}
}else{
if(d==0){
printf("%lld",c);
}else{
if(c==0){
printf("%lld/%lld",num.a,num.b);
}else{
printf("%lld %lld/%lld",c,d,num.b);
}
}
}
}
}
int main(){
int n;
while(~scanf("%d",&n)){
vector<Num> vec;
for(int i=0;i<n;i++){
Num num;
scanf("%lld/%lld",&num.a,&num.b);
vec.push_back(num);
}
Num num;
num.a=0,num.b=1;
for(int i=0;i<n;i++){
num.a=num.a*vec[i].b+num.b*vec[i].a;
num.b*=vec[i].b;
if(num.a==0){
num.a=0;
num.b=1;
}else{
simple(num);
}
}
//cout<<num.a<<" "<<num.b<<endl;
output(num);
cout<<endl;
}
return 0;
}