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
Ω
给出几个分数,计算其总和,以带分数的形式输出。
在以前需要自己手写最小公倍数/最大公因数函数,有了numeric库函数,妈妈再也不用担心我因为码题而吃不上饭啦。在读入所有分数的时候,先对所有分数进行约分,同时计算至此为止所有分母的最小公倍数,根据最新分母计算分子总和,最后再进行一次约分即可。
⚠️ 分子为0时只能输出一个0。
C ☺ D E
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
int main()
{
int n, g, dmt = 1, nrt = 0, time;
cin >> n;
vector<pair<int, int>> frac(n);
for (auto &f: frac)
{
scanf("%d/%d", &f.first, &f.second);
g = gcd(f.first, f.second);
f.first /= g, f.second /= g;
time = lcm(dmt, f.second) / dmt;
nrt = time * nrt + time * dmt / f.second * f.first;
dmt *= time;
}
g = gcd(nrt, dmt);
nrt /= g, dmt /= g;
if (nrt / dmt == 0 && nrt != 0)
cout << nrt << "/" << dmt;
else if (nrt % dmt == 0)
cout << nrt / dmt;
else
cout << nrt / dmt << " " << nrt % dmt << "/" << dmt;
}