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/3
Sample Output 1:
3 1/3
Sample Input 2:
2
4/3 2/3
Sample Output 2:
2
Sample Input 3:
3
1/3 -1/6 1/8
Sample Output 3:
7/24
注意分子和为0的情况
1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 long GCD(long a, long b){ 5 a=abs(a); 6 b=abs(b); 7 while(b){ 8 long temp=a%b; 9 a=b; 10 b=temp; 11 } 12 return a; 13 } 14 int main(){ 15 long int n, i, fz=0, fm=0, a, b; 16 cin>>n; 17 scanf("%lld/%lld", &fz, &fm); 18 for(i=1; i<n; i++){ 19 scanf("%lld/%lld", &a, &b); 20 fz = fz*b+a*fm; fm=fm*b; 21 long int gcd = GCD(fz, fm); 22 fz /= gcd; fm /= gcd; 23 } 24 if(fz==0) cout<<0; 25 else if(fz<fm) cout<<fz<<"/"<<fm<<endl; 26 else{ 27 cout<<fz/fm; 28 if(fz%fm!=0) cout<<" "<<fz%fm<<"/"<<fm; 29 } 30 return 0; 31 }
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 long int GCD(long int a, long int b){ 5 return b==0 ? a : GCD(b, a%b); 6 } 7 int main(){ 8 int n, i; 9 long int fz=0, fm=0; 10 scanf("%d %lld/%lld", &n, &fz, &fm); 11 long int gcd; 12 for(i=1; i<n; i++){ 13 long int a, b; 14 scanf("%lld/%lld", &a, &b); 15 gcd = GCD(fm, b); 16 /* 17 这里可能存在大数相乘, 多半会溢出, 所以在这里在相加的时候 18 应该约分, 此外不能写作fz/gcd*b, 当fz小于gcd的时候, 结果就会为0 19 */ 20 fz = fz*(b/gcd) + a*(fm/gcd); fm = fm/gcd*b; 21 } 22 gcd = GCD(fz, fm); 23 fz = fz/gcd; fm = fm/gcd; 24 if(fz==0) printf("0"); 25 else if(fz%fm==0) printf("%lld", fz/fm); 26 else if(fz>fm) printf("%lld %lld/%lld", fz/fm, fz%fm, fm); 27 else printf("%lld/%lld", fz, fm); 28 return 0; 29 }