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 <vector>
using namespace std;
//最大公约数
long long gcd( long long x , long long y){
long long max,min,temp;
max = x > y ? x : y ;
min = x < y ? x : y ;
while( max % min ){
temp = max % min;
max = min;
min = temp;
}
return min;
}
//最小公倍数
long long lcm( long long x , long long y ){
return x*y/gcd(x,y);
}
int main(){
vector<long long> numerator,denominator,factor;
char c;
long long a,b,temp,sum = 0;
int n;
cin>>n;
for ( int i = 0; i < n ; i++ ){
cin>>a>>c>>b;
numerator.push_back(a);
denominator.push_back(b);
}
temp = denominator[0];
for ( int i = 1; i < denominator.size() ; i++ ){
temp = lcm( temp , denominator[i] );
}
for ( int i = 0; i < denominator.size() ; i++ ){
factor.push_back(temp/denominator[i]);
}
for ( int i = 0; i < numerator.size() ; i++ ){
numerator[i]=numerator[i]*factor[i];
sum += numerator[i];
}
if( sum%temp && sum/temp )
cout<<(sum/temp)<<" "<<((sum%temp)/gcd((sum%temp),temp))<<"/"<<(temp/gcd((sum%temp),temp));
else if( sum%temp && !(sum/temp) )
cout<<((sum%temp)/gcd((sum%temp),temp))<<"/"<<(temp/gcd((sum%temp),temp));
else
cout<<(sum/temp);
return 0;
}