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 <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
struct node{
node(){
}
node(long int fenzi, long int fenmu){
fz = fenzi;
fm = fenmu;
}
long int fz, fm;
};
//求最大公约数
long int gyc (long int a, long int b){
long int max = a>b? a:b;
long int min = a<b? a:b;
if(max%min == 0)
return min;
else
return gyc(min, max%min);
}
void plusFun(node &a, node &b){
long int fzA, fmA, fzB, fmB, fz, fm, t;
fzA = a.fz;
fmA = a.fm;
fzB = b.fz;
fmB = b.fm;
fz = fzA*fmB + fzB*fmA;
fm = fmA*fmB;
if(fz != 0){
//分子为零的情况下不要去求公约数,否则会出错
t = gyc(abs(fz),abs(fm));
}else{
t = 1;
}
fz /= t;
fm /= t;
a.fz = fz;
a.fm = fm;
}
int main(int argc, char** argv) {
long int N, i, fz, fm;
cin>>N;
vector<node> vec;
node result(0,1);
node t;
char ch;
for(i=0; i<N; i++){
cin>>fz>>ch>>fm;
vec.push_back(node(fz,fm));
plusFun(result, vec[i]);
}
long int z;
z = result.fz/result.fm;
if(z != 0){
result.fz =abs(result.fz) - abs(z) * result.fm ;
cout<<z;
if(result.fz == 0)
return 0 ;
else
cout<<" "<<result.fz<<"/"<<result.fm<<endl;
}else{
if(result.fz == 0)
cout<<"0"<<endl;
else
cout<<result.fz<<"/"<<result.fm<<endl;
}
return 0;
}