题目
![]()
解法1
点击查看代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Rnum {
long long nr;
long long dr;
};
// 最大公约数
long long gcd(long long a, long long b) {
return b == 0 ? a : gcd(b, a % b);
}
// 最小公倍数
long long lcm(long long a, long long b) {
return a / gcd(a, b) * b;
}
int main() {
int N;
cin >> N;
vector<Rnum> vr(N);
long long DR = 1; // 分母最小公倍数
for (int i = 0; i < N; i++) {
long long nr, dr;
scanf("%lld/%lld", &nr, &dr);
// 统一分子带负号,分母为正
if (dr < 0) {
dr = -dr;
nr = -nr;
}
// 约分
long long g = gcd(abs(nr), dr);
nr /= g;
dr /= g;
vr[i] = {nr, dr};
DR = lcm(DR, dr); // 记录最小公倍数
}
// 求和分子
long long NR = 0;
for (auto& frac : vr) {
long long base = DR / frac.dr;
NR += frac.nr * base;
}
if (NR == 0) {
cout << 0 << endl;
return 0;
}
long long intPart = NR / DR;
long long remNr = abs(NR % DR);
long long g = gcd(remNr, DR); // 约分
remNr /= g;
DR /= g;
// 输出 1. 既有整数,也有分数 2.只有整数 3.只有分数
if (intPart != 0 && remNr != 0) cout << intPart << " " << remNr << "/" << DR << endl;
else if (remNr == 0) cout << intPart << endl;
else if (intPart == 0) cout << (NR < 0 ? "-" : "") << remNr << "/" << DR << endl;
return 0;
}