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 }

 

posted @ 2018-06-12 22:42  赖兴宇  阅读(206)  评论(0编辑  收藏  举报