Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int gcd(int a, int b) {
- if (!b)
- return a;
- return gcd(b, a % b);
- }
- class Rational {
- private:
- int p;
- int q;
- public:
- Rational() {
- p = 0;
- q = 1;
- }
- Rational(int numerator, int denominator) {
- if (numerator == 0) {
- p = 0;
- q = 1;
- } else {
- bool is_positive = (numerator * denominator > 0);
- p = (is_positive) ?
- abs(numerator) / gcd(abs(numerator), abs(denominator)) :
- (-1) * abs(numerator)
- / gcd(abs(numerator), abs(denominator));
- q = abs(denominator) / gcd(abs(numerator), abs(denominator));
- }
- }
- int Numerator() const {
- return p;
- }
- int Denominator() const {
- return q;
- }
- };
- Rational operator+(const Rational &lhs, const Rational &rhs) {
- if (lhs.Denominator() != rhs.Denominator()) {
- return Rational(
- lhs.Numerator() * rhs.Denominator()
- + rhs.Numerator() * lhs.Denominator(),
- lhs.Denominator() * rhs.Denominator());
- }
- return Rational(lhs.Numerator() + rhs.Numerator(), lhs.Denominator());
- }
- Rational operator-(const Rational &lhs, const Rational &rhs) {
- if (lhs.Denominator() != rhs.Denominator()) {
- return Rational(
- lhs.Numerator() * rhs.Denominator()
- - rhs.Numerator() * lhs.Denominator(),
- lhs.Denominator() * rhs.Denominator());
- }
- return Rational(lhs.Numerator() - rhs.Numerator(), lhs.Denominator());
- }
- bool operator==(const Rational &lhs, const Rational &rhs) {
- return (lhs.Numerator() == rhs.Numerator())
- && (lhs.Denominator() == rhs.Denominator());
- }
- //mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
- int main(void) {
- {
- Rational r1(4, 6);
- Rational r2(2, 3);
- bool equal = r1 == r2;
- if (!equal) {
- cout << "4/6 != 2/3" << endl;
- return 1;
- }
- }
- {
- Rational a(2, 3);
- Rational b(4, 3);
- Rational c = a + b;
- bool equal = c == Rational(2, 1);
- if (!equal) {
- cout << "2/3 + 4/3 != 2" << endl;
- return 2;
- }
- }
- {
- Rational a(5, 7);
- Rational b(2, 9);
- Rational c = a - b;
- bool equal = c == Rational(31, 63);
- if (!equal) {
- cout << "5/7 - 2/9 != 31/63" << endl;
- return 3;
- }
- }
- cout << "OK" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment