_takumi

Rational

Sep 17th, 2019
439
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int gcd(int a, int b) {
  5.     if (!b)
  6.         return a;
  7.     return gcd(b, a % b);
  8. }
  9.  
  10. class Rational {
  11. private:
  12.     int p;
  13.     int q;
  14. public:
  15.     Rational() {
  16.         p = 0;
  17.         q = 1;
  18.     }
  19.     Rational(int numerator, int denominator) {
  20.         if (numerator == 0) {
  21.             p = 0;
  22.             q = 1;
  23.         } else {
  24.             bool is_positive = (numerator * denominator > 0);
  25.             p = (is_positive) ?
  26.                     abs(numerator) / gcd(abs(numerator), abs(denominator)) :
  27.                     (-1) * abs(numerator)
  28.                             / gcd(abs(numerator), abs(denominator));
  29.             q = abs(denominator) / gcd(abs(numerator), abs(denominator));
  30.         }
  31.     }
  32.  
  33.     int Numerator() const {
  34.         return p;
  35.     }
  36.     int Denominator() const {
  37.         return q;
  38.     }
  39. };
  40.  
  41. Rational operator+(const Rational &lhs, const Rational &rhs) {
  42.     if (lhs.Denominator() != rhs.Denominator()) {
  43.         return Rational(
  44.                 lhs.Numerator() * rhs.Denominator()
  45.                         + rhs.Numerator() * lhs.Denominator(),
  46.                 lhs.Denominator() * rhs.Denominator());
  47.     }
  48.     return Rational(lhs.Numerator() + rhs.Numerator(), lhs.Denominator());
  49. }
  50.  
  51. Rational operator-(const Rational &lhs, const Rational &rhs) {
  52.     if (lhs.Denominator() != rhs.Denominator()) {
  53.         return Rational(
  54.                 lhs.Numerator() * rhs.Denominator()
  55.                         - rhs.Numerator() * lhs.Denominator(),
  56.                 lhs.Denominator() * rhs.Denominator());
  57.     }
  58.     return Rational(lhs.Numerator() - rhs.Numerator(), lhs.Denominator());
  59. }
  60.  
  61. bool operator==(const Rational &lhs, const Rational &rhs) {
  62.     return (lhs.Numerator() == rhs.Numerator())
  63.             && (lhs.Denominator() == rhs.Denominator());
  64. }
  65.  
  66. //mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
  67.  
  68. int main(void) {
  69.     {
  70.         Rational r1(4, 6);
  71.         Rational r2(2, 3);
  72.         bool equal = r1 == r2;
  73.         if (!equal) {
  74.             cout << "4/6 != 2/3" << endl;
  75.             return 1;
  76.         }
  77.     }
  78.  
  79.     {
  80.         Rational a(2, 3);
  81.         Rational b(4, 3);
  82.         Rational c = a + b;
  83.         bool equal = c == Rational(2, 1);
  84.         if (!equal) {
  85.             cout << "2/3 + 4/3 != 2" << endl;
  86.             return 2;
  87.         }
  88.     }
  89.  
  90.     {
  91.         Rational a(5, 7);
  92.         Rational b(2, 9);
  93.         Rational c = a - b;
  94.         bool equal = c == Rational(31, 63);
  95.         if (!equal) {
  96.             cout << "5/7 - 2/9 != 31/63" << endl;
  97.             return 3;
  98.         }
  99.     }
  100.  
  101.     cout << "OK" << endl;
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment