PAT甲級——1081 Rational Sum——分?jǐn)?shù) 20
題目

解法1
點(diǎn)擊查看代碼
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Rnum {
long long nr;
long long dr;
};
// 最大公約數(shù)
long long gcd(long long a, long long b) {
return b == 0 ? a : gcd(b, a % b);
}
// 最小公倍數(shù)
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; // 分母最小公倍數(shù)
for (int i = 0; i < N; i++) {
long long nr, dr;
scanf("%lld/%lld", &nr, &dr);
// 統(tǒng)一分子帶負(fù)號,分母為正
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); // 記錄最小公倍數(shù)
}
// 求和分子
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. 既有整數(shù),也有分?jǐn)?shù) 2.只有整數(shù) 3.只有分?jǐn)?shù)
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;
}
posted on 2025-04-26 09:34 LEESOL-cn 閱讀(18) 評論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號