PAT1081:Rational Sum

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:
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.辗转相除法求分子分母的最大公约数
2.两分数相加后要化简,不然容易在计算时产生溢出。
3.输出需要特别注意的格式:
1)在整数不为0的情况下,分数为0则只输出整数。
2)在整数为0的情况下,分数不为0则只输出分数。
3)二者都为0直接输出一个0。
4)二者都不为0按题目要求的标准格式输出。
4.关于分母为0的情况,题目测试用例好像并未考虑,暂不做处理。

代码
#include<iostream>
using namespace std;
typedef long long ll;

ll gcd(ll a,ll b) //求最大公约数
{
   return b == 0?abs(a):gcd(b,a % b);
}
int main()
{
   ll N,a,b,gvalue,suma,sumb;
   while( cin >> N)
   {
       suma = 0,sumb = 1;
       for(int i = 0;i < N;i++)
       {
           scanf("%lld/%lld",&a,&b);
           gvalue = gcd(a,b);
           //约分
           a /= gvalue;
           b /= gvalue;
           //分数求公倍数相加
           suma = a * sumb + b * suma;
           sumb = b * sumb;
           //分子和约分
           gvalue = gcd(suma,sumb);
           suma /= gvalue;
           sumb /= gvalue;
       }
       ll integer = suma / sumb;
       ll numerator = suma - integer * sumb;
       if(integer != 0)
       {
          cout << integer;
          if(numerator != 0)
          {
              cout << " ";
              printf("%lld/%lld",numerator,sumb);
          }
       }
       else
       {
          if(numerator != 0)
          {
              printf("%lld/%lld",numerator,sumb);
          }
          else
              cout << 0;
       }
       cout << endl;
   }
}

  

posted @ 2017-11-21 10:59  0kk470  阅读(201)  评论(0编辑  收藏  举报