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
分析:
本题如果不每走一步都化简一次的话,就会出现浮点错误。原因很简单,模拟多次之后分子分母早就溢出了,可能导致分母为零。所以每次操作之后都记得要化简一次。
PS:本题不需要考虑输入的数是否合法(分母不为零)。
代码:
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 100;
void sim(long long a, long long b, char res[]);
long long gcd(long long a, long long b)
{
return !b ? a : gcd(b, a % b);
}
int main()
{
char s2[maxn];
char temp[maxn], res[maxn];
int N;
long long a1, b1, a2, b2;
cin >> N;
a1 = 0, b1 = 1;
while(N--)
{
int tempa, tempb;
cin >> s2;
sscanf(s2, "%lld/%lld", &a2, &b2);
tempa = a1 * b2 + a2 * b1, tempb = b1 * b2;
a1 = tempa, b1 = tempb;
int mgcd = gcd(abs(a1), b1);
a1 /= mgcd, b1 /= mgcd;
}
sim(a1, b1, res);
cout << res;
return 0;
}
void sim(long long a, long long b, char res[])
{
char temp[maxn];
if(a / b)
{
sprintf(temp, "%lld", a / b);
if(a % b) sprintf(&temp[strlen(temp)], " %lld/%lld", abs(a % b), b);
}
else
{
if(a % b) sprintf(temp, "%lld/%lld", a, b);
else sprintf(temp, "%lld", 0);
}
sprintf(res, "%s", temp);
}