Files
exercises/cs101/dh_20260909_05_sum_fractions.cpp
T
2026-09-25 20:20:01 +08:00

77 lines
1.7 KiB
C++

#include <iostream>
#include <sstream>
using namespace std;
long long gcd(long long x, long long y) {
if (x < y) swap(x, y);
if (x % y == 0) { return y; }
return gcd(y, x % y);
}
class Fraction {
public:
long long numerator = 0, denominator = 1;
void simplify() {
if (numerator == 0) { denominator = 1; }
long long g = gcd(numerator, denominator);
numerator /= g, denominator /= g;
}
Fraction operator+(const Fraction& other) const {
Fraction result{
numerator * other.denominator + denominator * other.numerator,
denominator * other.denominator
};
result.simplify();
return result;
}
Fraction operator+=(const Fraction& other) {
return *this = *this + other;
}
Fraction() = default;
Fraction(const long long n, const long long d) : numerator(n), denominator(d) { simplify(); }
Fraction(const string& s) {
stringstream ss(s);
long long n, d;
char slash;
if (ss >> n >> slash >> d && slash == '/') {
numerator = n, denominator = d;
simplify();
} else {
throw invalid_argument("String is not a fraction");
}
}
[[nodiscard]] string to_string() const {
if (denominator == 1) {
return std::to_string(numerator);
}
return std::to_string(numerator) + '/' + std::to_string(denominator);
}
};
int n;
string s;
Fraction ans;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int _ = 0; _ < n; _++) {
// clog << ans.numerator << '/' << ans.denominator << endl;
cin >> s;
ans += Fraction(s);
}
cout << ans.to_string() << endl;
return 0;
}