#include "Rational2.h" #include #include using namespace std; // gcd functions: would normally be a static members int gcd2(int x, int y) { return (y == 0) ? x : gcd2(y, x%y); } int gcd(int x, int y) { // Force result to be positive return gcd2(abs(x), abs(y)); } void Rational::reduce() { int div = gcd(numerator, denominator); assert(div > 0); if (div != 1) { numerator /= div; denominator /= div; } } Rational& Rational::operator+=(const Rational& r) { numerator = numerator*r.denominator + denominator*r.numerator; denominator = denominator*r.denominator; reduce(); return *this; } Rational& Rational::operator-=(const Rational& r) { numerator = numerator*r.denominator - denominator*r.numerator; denominator = denominator*r.denominator; reduce(); return *this; } Rational& Rational::operator*=(const Rational& r) { numerator *= r.numerator; denominator *= r.denominator; reduce(); return *this; } Rational& Rational::operator/=(const Rational& r) { assert(r.numerator != 0); numerator *= r.denominator; denominator *= r.numerator; reduce(); return *this; } istream& operator>>(istream& is, Rational& r) { char slash; is >> r.numerator >> slash; assert(slash == '/'); is >> r.denominator; r.reduce(); return is; } ostream& operator<<(ostream& os, const Rational& r) { return os << r.numerator << '/' << r.denominator; }