PAT-A-1081. Rational Sum (20)

来源:互联网 发布:购物类网站数据库设计 编辑:程序博客网 时间:2024/06/06 03:51

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<cstdio>#include<math.h>#include<stdio.h>using namespace std;typedef long long LL;struct Fraction{  LL up;  LL down;};int gcd(LL a, LL b){  if (b == 0)    return a;  else    return gcd(b, a%b);}Fraction reduction(Fraction ans){  if (ans.down < 0)  {    ans.up = -ans.up;    ans.down = -ans.down;  }  if (ans.up == 0)    ans.down = 1;  else  {    int d = gcd(abs(ans.up), abs(ans.down));    ans.up = ans.up / d;    ans.down = ans.down / d;  }  return ans;}void show(Fraction ans){  if (ans.down == 1)    cout << ans.up;  else if (abs(ans.up) > ans.down)    cout << ans.up / ans.down << " " << abs(ans.up) % ans.down << "/" << ans.down << endl;  else    cout << ans.up << "/" << ans.down << endl;}Fraction add(Fraction f1, Fraction f2){  Fraction ans;  ans.up = f1.up*f2.down + f2.up*f1.down;  ans.down = f1.down*f2.down;  return reduction(ans);}int main(){  int n;  Fraction sum, temp;  sum.up = 0;  sum.down = 1;  cin >> n;  for (int i = 0; i < n; i++)  {    scanf("%lld/%lld", &temp.up, &temp.down);    sum = add(sum, temp);  }  show(sum);  system("pause");  return 0;}

0 0