#include #include #include struct Rational { int numerator; int denominator; }; // Garante que: // - r.denominator > 0 // - std::gcd(r.numerator, r.denominator) == 1 void normalize(Rational &r) { // Se denominador fornecido e zero, nao ha o que fazer. assert(r.denominator != 0); // Garante que o denominador e positivo. if (r.denominator < 0) { r.numerator = -r.numerator; r.denominator = -r.denominator; } // Elimina fatores comuns no numerador e denominador. auto common = std::gcd(r.numerator, r.denominator); r.numerator /= common; r.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; normalize(result); 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; normalize(result); 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; normalize(result); 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; normalize(result); return result; } // Calcula -a Rational negative(Rational a) { Rational result; result.numerator = -a.numerator; result.denominator = a.denominator; return result; } // Verifica se a == b bool are_equal(Rational a, Rational b) { return a.numerator == b.numerator && a.denominator == b.denominator; } // Ajusta numerador e denominador de r. void set(Rational &r, int numerator, int denominator) { r.numerator = numerator; r.denominator = denominator; normalize(r); } void show(std::ostream &os, Rational r, std::string sep = "\n") { os << r.numerator << "/" << r.denominator << sep; } int main(int, char *[]) { Rational a, b, c; set(a, 1, 4); set(b, 3, 7); 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); set(c, 0, 1); for (int i = 0; i < 10; ++i) { c = add(c, multiply(a, b)); show(std::cout, c, ", "); } std::cout << std::endl; }