Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <sstream>
- #include <cctype>
- #include <algorithm>
- #include <iterator>
- #include <cstdlib>
- #include <vector>
- int nod(int x, int y) {
- if (y == 0)
- return x;
- return nod(y, x % y);
- }
- class Rational {
- public:
- int nom;
- int denom;
- Rational() {
- nom = 0;
- denom = 1;
- }
- Rational(const int &new_n, const int &new_d) {
- if (new_n == 0) {
- nom = 0;
- denom = 1;
- } else {
- nom = new_n;
- denom = new_d;
- }
- }
- const Rational simpl() const {
- Rational ans;
- ans.nom = nom;
- ans.denom = denom;
- if (nom != 0) {
- int tmp = nod(nom, denom);
- ans.nom /= tmp;
- ans.denom /= tmp;
- } else {
- ans.nom = 0;
- ans.denom = 1;
- }
- if (ans.denom < 0) {
- ans.nom *= -1;
- ans.denom *= -1;
- return (ans);
- }
- return ans;
- }
- int numerator() const {
- return simpl().nom;
- }
- int denominator() const {
- return simpl().denom;
- }
- };
- Rational int_to_rat(const int &n) {
- return Rational(n, 1);
- }
- const Rational operator+ (const Rational& l, const Rational& right) {
- Rational sum;
- sum.nom = l.nom * right.denom + right.nom * l.denom;
- sum.denom = l.denom * right.denom;
- return sum;
- }
- const Rational operator+ (const Rational& l, const int& right) {
- Rational r = int_to_rat(right);
- Rational sum;
- sum.nom = l.nom * r.denom + r.nom * l.denom;
- sum.denom = l.denom * r.denom;
- return sum;
- }
- const Rational operator- (const Rational& l, const Rational& right) {
- Rational sum;
- sum.nom = l.nom * right.denom - right.nom * l.denom;
- sum.denom = l.denom * right.denom;
- return sum;
- }
- const Rational operator- (const Rational& l, const int& right) {
- Rational r = int_to_rat(right);
- Rational sum;
- sum.nom = l.nom * r.denom - r.nom * l.denom;
- sum.denom = l.denom * r.denom;
- return sum;
- }
- const Rational operator* (const Rational& l, const Rational& right) {
- Rational sum;
- sum.nom = l.nom * right.nom;
- sum.denom = l.denom * right.denom;
- return sum;
- }
- const Rational operator* (const Rational& l, const int& right) {
- Rational r = int_to_rat(right);
- Rational sum;
- sum.nom = l.nom * r.nom;
- sum.denom = l.denom * r.denom;
- return sum;
- }
- const Rational operator/ (const Rational& l, const Rational& right) {
- Rational sum;
- sum.nom = l.nom * right.denom;
- sum.denom = l.denom * right.nom;
- return sum;
- }
- const Rational operator/ (const Rational& l, const int& right) {
- Rational r = int_to_rat(right);
- Rational sum;
- sum.nom = l.nom * r.denom;
- sum.denom = l.denom * r.nom;
- return sum;
- }
- template <typename T>
- Rational operator+= (Rational& l, const T& right) {
- Rational ans = Rational(l.nom, l.denom) + right;
- l.nom = ans.nom;
- l.denom = ans.denom;
- return ans;
- }
- template <typename T>
- Rational operator-= (Rational& l, const T& right) {
- Rational ans = Rational(l.nom, l.denom) - right;
- l.nom = ans.nom;
- l.denom = ans.denom;
- return ans;
- }
- template <typename T>
- Rational operator*= (Rational& l, const T& right) {
- Rational ans = Rational(l.nom, l.denom) * right;
- l.nom = ans.nom;
- l.denom = ans.denom;
- return ans;
- }
- template <typename T>
- Rational operator/= (Rational& l, const T& right) {
- Rational ans = Rational(l.nom, l.denom) / right;
- l.nom = ans.nom;
- l.denom = ans.denom;
- return ans;
- }
- bool operator== (const Rational& l, const Rational& right) {
- return ((l.numerator() == right.numerator()) && (l.denominator() == right.denominator()));
- }
- bool operator== (const Rational& l, const int& right) {
- Rational r = int_to_rat(right);
- return ((l.numerator() == r.numerator()) && (l.denominator() == r.denominator()));
- }
- bool operator== (const int& l, const Rational& right) {
- Rational r = int_to_rat(l);
- return ((right.numerator() == r.numerator()) && (right.denominator() == r.denominator()));
- }
- bool operator!= (const Rational& l, const Rational& right) {
- return ((l.numerator() != right.numerator()) && (l.denominator() != right.denominator()));
- }
- bool operator!= (const Rational& l, const int& right) {
- Rational r = int_to_rat(right);
- return ((l.numerator() != r.numerator()) && (l.denominator() != r.denominator()));
- }
- bool operator!= (const int& l, const Rational& right) {
- Rational r = int_to_rat(l);
- return ((right.numerator() != r.numerator()) && (right.denominator() != r.denominator()));
- }
- Rational& operator++ (Rational& l) {
- l = l + 1;
- return l;
- }
- const Rational operator++ (Rational& l, int) {
- l.nom = l.nom + l.denom;
- return Rational(l.nom - l.denom, l.denom);
- }
- Rational& operator-- (Rational& l) {
- l = l - 1;
- return l;
- }
- const Rational operator-- (Rational& l, int) {
- l.nom = l.nom - l.denom;
- return Rational(l.nom + l.denom, l.denom);
- }
- Rational operator- (Rational& l) {
- l.nom = -l.nom;
- return Rational(l.nom, l.denom);
- }
- Rational operator+ (const Rational& l) {
- return Rational(l.nom, l.denom);
- }
- const Rational operator+ (const int& right, const Rational& r) {
- Rational l = {right, 1};
- Rational sum;
- sum.nom = l.nom * r.denom + r.nom * l.denom;
- sum.denom = l.denom * r.denom;
- return sum;
- }
- const Rational operator- (const int& right, const Rational& rr) {
- Rational r = Rational(right, 1);
- return (r - rr);
- }
- const Rational operator* (const int& right, const Rational& rr) {
- Rational r = Rational(right, 1);
- return (r * rr);
- }
- const Rational operator/ (const int& right, const Rational& rr) {
- Rational r = Rational(right, 1);
- return (r / rr);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement