--- tags: codebook --- {%hackmd theme-dark %} # fraction ```cpp= #include<iostream> #include<algorithm> #include<cmath> #include<sstream> using namespace std; struct fraction { int numerator; int denominator; fraction(int a = 0, int b = 1): numerator(a), denominator(b) { auto gcd = __gcd(numerator, denominator); numerator /= gcd, denominator /= gcd; if ((numerator < 0) ^ (denominator < 0)) numerator = -abs(numerator), denominator = abs(denominator); else numerator = abs(numerator), denominator = abs(denominator); } friend fraction operator+(fraction a, fraction b) { auto gcd = __gcd(a.denominator, b.denominator); a.numerator *= b.denominator / gcd; b.numerator *= a.denominator / gcd; return fraction(a.numerator + b.numerator, a.denominator * b.denominator / gcd); } friend fraction operator-(fraction a, fraction b) { auto gcd = __gcd(a.denominator, b.denominator); a.numerator *= b.denominator / gcd; b.numerator *= a.denominator / gcd; return fraction(a.numerator - b.numerator, a.denominator * b.denominator / gcd); } friend istream& operator>>(istream& is, fraction& f) { string str; is >> str; replace(str.begin(), str.end(), '/', ' '); stringstream ss(str); int a, b; ss >> a >> b; f = fraction(a, b); return is; } friend ostream& operator<<(ostream& os, const fraction& f) { cout << f.numerator << '/' << f.denominator << endl; return os; } }; int main() { fraction ans, tmp; char op; cin >> ans; while (cin >> op >> tmp) switch (op) { case '+': ans = ans + tmp; break; case'-': ans = ans - tmp; break; } cout << ans << endl; return 0; } ```