#include #include #include // VERSÃO 3! class Rational { int _numerator; int _denominator; // Garante que: // - r.denominator > 0 // - std::gcd(r.numerator, r.denominator) == 1 void _normalize(); public: // Cria um racional com numerador e denominador especificados. Rational(int numerator = 0, int denominator = 1) : _numerator(numerator), _denominator(denominator) { _normalize(); } // Calcula a * b. friend Rational multiply(Rational a, Rational b); // Calcula a / b. friend Rational divide(Rational a, Rational b); // Calcula a + b. friend Rational add(Rational a, Rational b); // Calcula a - b. friend Rational subtract(Rational a, Rational b); // Calcula -a. friend Rational negative(Rational a); // Verifica se a == b. friend bool are_equal(Rational a, Rational b) { return a._numerator == b._numerator && a._denominator == b._denominator; } // Acesso (apenas leitura) a numerador e denominador. int numerator() const { return _numerator; } int denominator() const { return _denominator; } }; // Garante que: // - r.denominator > 0 // - std::gcd(r.numerator, r.denominator) == 1 void Rational::_normalize() { // Se denominador fornecido e zero, nao ha o que fazer. assert(_denominator != 0); // Garante que o denominador e positivo. if (_denominator < 0) { _numerator = -_numerator; _denominator = -_denominator; } // Elimina fatores comuns no numerador e denominador. auto common = std::gcd(_numerator, _denominator); _numerator /= common; _denominator /= common; } // Calcula a * b. Rational multiply(Rational a, Rational b) { Rational result; result._numerator = a._numerator * b._numerator; result._denominator = a._denominator * b._denominator; result._normalize(); return result; } // Calcula a / b. Rational divide(Rational a, Rational b) { Rational result; result._numerator = a._numerator * b._denominator; result._denominator = a._denominator * b._numerator; result._normalize(); return result; } // Calcula a + b. Rational add(Rational a, Rational b) { Rational result; result._numerator = a._numerator * b._denominator + a._denominator * b._numerator; result._denominator = a._denominator * b._denominator; result._normalize(); return result; } // Calcula a - b. Rational subtract(Rational a, Rational b) { Rational result; result._numerator = a._numerator * b._denominator - a._denominator * b._numerator; result._denominator = a._denominator * b._denominator; result._normalize(); return result; } // Calcula -r. Rational negative(Rational r) { Rational result; result._numerator = -r._numerator; result._denominator = r._denominator; return result; } void show(std::ostream &os, Rational r, std::string sep = "\n") { os << r.numerator() << "/" << r.denominator() << sep; } int main(int, char *[]) { Rational a(1, 4), b(3, 7), c; c = multiply(a, b); show(std::cout, c); c = divide(a, b); show(std::cout, c); c = add(a, b); show(std::cout, c); c = subtract(a, b); show(std::cout, c); c = Rational(0); for (int i = 0; i < 10; ++i) { c = add(c, multiply(a, b)); show(std::cout, c, ", "); } std::cout << std::endl; }