A1081. Rational Sum

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

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef struct{
 6     long long up, down;
 7 }fra;
 8 long long gcd(long long a, long long b){
 9     a = abs(a);
10     b = abs(b);
11     if(b == 0)
12         return a;
13     else return gcd(b, a % b);
14 }
15 fra cacul(fra a, fra b){
16     fra temp;
17     temp.down = a.down * b.down;
18     temp.up = a.down * b.up + b.down * a.up;
19     long long fact = gcd(temp.up, temp.down);
20     temp.down = temp.down / fact;
21     temp.up = temp.up / fact;
22     return temp;
23 }
24 int main(){
25     int N;
26     fra re = {0,1}, temp = {0, 1};
27     scanf("%d", &N);
28     for(int i = 0; i < N; i++){
29         scanf("%lld/%lld", &temp.up, &temp.down);
30         re = cacul(re, temp);
31     }
32     if(re.up == 0){
33         printf("0");
34     }else if(abs(re.up) == abs(re.down)){
35         printf("%lld", re.up / re.down);
36     }else if(abs(re.up) > abs(re.down)){
37         if(re.up % re.down == 0)
38             printf("%d", re.up / re.down);
39         else
40             printf("%lld %lld/%lld", re.up / re.down, re.up % re.down, re.down);
41     }else{
42         printf("%lld/%lld", re.up, re.down);
43     }
44     cin >> N;
45     return 0;
46 }
View Code

 

总结:

1、分数运算化简:化简时分子分母同除最大公因数。 输出时考虑:分子为0时直接输出0;分子>=分母时(用绝对值比较,是>=而非>),可以整除则输出整数,否则输出代分数(4/1直接输出4);

2、gcd函数:

int gcd(int a, int b){ 
if(b == 0) return a; else return gcd(b, a % b); }

 

posted @ 2018-02-04 19:55  ZHUQW  阅读(128)  评论(0编辑  收藏  举报