PAT-A 真题 – 1081 Rational Sum

发布于 / PAT-甲级 / 0 条评论

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的情况。

#include <bits/stdc++.h>
using namespace std;

struct node{
  long long n, d;
  node():n(0), d(1){}
};

void fuck(node &a){
  long long gcd = __gcd(a.n, a.d);
  a.n /= gcd, a.d /= gcd;
}

node add(node a, node b){
  fuck(a), fuck(b);
  node ans;
  ans.d = a.d * b.d;
  ans.n = a.n * b.d + b.n * a.d;
  fuck(ans);
  return ans;
}

int main(){
  int cnt;
  scanf("%d", &cnt);
  node ans;
  for(int i = 0; i < cnt; i++){
    node tmp;
    scanf("%lld/%lld", &tmp.n, &tmp.d);
    ans = add(ans, tmp);
  }
  bool flag = false;
  if(1.0 * ans.n / ans.d >= 1){
    printf("%lld", ans.n / ans.d);
    ans.n %= ans.d;
    flag = true;
  }
  if(ans.n){
    if(flag) printf(" ");
    printf("%lld", ans.n);
    if(ans.d != 1)
      printf("/%lld", ans.d);
  }
  else{
    if(flag == false) printf("0");
  }
  printf("\n");
  return 0;
}

转载原创文章请注明,转载自: 斐斐のBlog » PAT-A 真题 – 1081 Rational Sum
目前还没有评论,快来抢沙发吧~