1081. Rational Sum (20)

来源:互联网 发布:无证之罪 郭宇 知乎 编辑:程序博客网 时间:2024/04/29 20:41

1081. Rational Sum (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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:
52/5 4/15 1/30 -2/60 8/3
Sample Output 1:
3 1/3
Sample Input 2:
24/3 2/3
Sample Output 2:
2
Sample Input 3:
31/3 -1/6 1/8
Sample 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));elsecout<<(sum/temp);return 0;}



0 0