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<iostream>
#include<string>
#include<strstream>
#include<vector>
using namespace std;
int N;
int gcd(int a,int b){//the gcd of a1 and a2
if(a*b==0) return 1;
bool flag=true;
while(flag){
if(a>b){
a=a-b;
}
else if(a<b){
b=b-a;
}
else if(a==b){
break;
}
}
return a;
}
string add(string a1,string a2){
int numerator[2];
int denominator[2];
for(int i=0;i<a1.size();i++){
if(a1[i]=='/'){
numerator[0]=atoi(a1.substr(0,i).c_str());
denominator[0]=atoi(a1.substr(i+1,(int)a1.size()-1-i).c_str());
}
}
for(int i=0;i<a2.size();i++){
if(a2[i]=='/'){
numerator[1]=atoi(a2.substr(0,i).c_str());
denominator[1]=atoi(a2.substr(i+1,(int)a2.size()-1-i).c_str());
}
}
// cout<<numerator[0]<<" "<<denominator[0]<<endl;
// cout<<numerator[1]<<" "<<denominator[1]<<endl;
// if(denominator[0]*denominator[1])
int numeratorS=numerator[0]*denominator[1]+numerator[1]*denominator[0];
int denominatorS=denominator[0]*denominator[1];
for(int i=0;i<2;i++){
if(denominator[i]==0){
denominator[i]=1;
numerator[i]=0;
}
}
int GCD=gcd(numeratorS,denominatorS);
// cout<<"www "<<GCD;
numeratorS=numeratorS/GCD;
denominatorS=denominatorS/GCD;
string result;
strstream ss;
ss<<numeratorS;
ss>>result;
result+="/";
ss.clear();//clear
ss<<denominatorS;
string temps;
ss>>temps;
result+=temps;
return result;
}
vector<string> res(string a1){
vector<string> vec;
int numerator=0;
int denominator=0;
for(int i=0;i<a1.size();i++){
if(a1[i]=='/'){
numerator=atoi(a1.substr(0,i).c_str());
denominator=atoi(a1.substr(i+1,(int)a1.size()-1-i).c_str());
}
}
if(numerator*denominator==0){
vec.push_back("0");
return vec;
}
if(numerator%denominator==0){
int res=numerator/denominator;
strstream ss;
ss<<res;
string temp;
ss>>temp;
vec.push_back(temp);
return vec;
}
else if(numerator>denominator){
int res=numerator/denominator;
strstream ss;
ss<<res;
string temp;
ss>>temp;
vec.push_back(temp);
temp="";
string temp1;
ss.clear();
res=numerator%denominator;
ss<<res;
ss>>temp1;
temp+=temp1;
temp+="/";
ss.clear();
ss<<denominator;
ss>>temp1;
temp+=temp1;
vec.push_back(temp);
return vec;
}
else {
vec.push_back(a1);
}
return vec;
}
int main(){
cin>>N;
string s="0/1";
for(int i=0;i<N;i++){
string aaa;
cin>>aaa;
s=add(s,aaa);
}
vector<string> v=res(s);
for(int i=0;i<v.size()-1;i++){
cout<<v[i]<<" ";
}
cout<<v[v.size()-1];
return 0;
}
所有测试点均通过。