Advertisement
kutuzzzov

Урок 3

Sep 26th, 2022 (edited)
480
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. #include <numeric>
  2. #include <ostream>
  3. #include <vector>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. class Rational {
  9. public:
  10.     Rational() = default;
  11.  
  12.     Rational(int numerator)
  13.         : numerator_(numerator)
  14.         , denominator_(1) {
  15.     }
  16.  
  17.     Rational(int numerator, int denominator)
  18.         : numerator_(numerator)
  19.         , denominator_(denominator) {
  20.         Normalize();
  21.     }
  22.  
  23.     int Numerator() const {
  24.         return numerator_;
  25.     }
  26.  
  27.     int Denominator() const {
  28.         return denominator_;
  29.     }
  30.  
  31.  
  32. private:
  33.     void Normalize() {
  34.         if (denominator_ < 0) {
  35.             numerator_ = -numerator_;
  36.             denominator_ = -denominator_;
  37.         }
  38.         const int divisor = gcd(numerator_, denominator_);
  39.         numerator_ /= divisor;
  40.         denominator_ /= divisor;
  41.     }
  42.  
  43.     int numerator_ = 0;
  44.     int denominator_ = 1;
  45. };
  46.  
  47. ostream& operator<<(ostream& out, Rational value) {
  48.     out << value.Numerator() << "/"s << value.Denominator();
  49.     return out;
  50. }
  51.  
  52. istream& operator>>(istream& in, Rational& value) {
  53.     int numerator, denominator;
  54.     char drob;
  55.     in >> numerator >> drob >> denominator;
  56.     value = Rational{ numerator, denominator };
  57.     return in;
  58. }
  59.  
  60. Rational operator+(Rational left, Rational right) {
  61.     const int numerator = left.Numerator() * right.Denominator()
  62.         + right.Numerator() * left.Denominator();
  63.     const int denominator = left.Denominator() * right.Denominator();
  64.  
  65.     return { numerator, denominator };
  66. }
  67.  
  68. Rational operator-(Rational left, Rational right) {
  69.     const int numerator = left.Numerator() * right.Denominator()
  70.         - right.Numerator() * left.Denominator();
  71.     const int denominator = left.Denominator() * right.Denominator();
  72.  
  73.     return { numerator, denominator };
  74. }
  75.  
  76. Rational operator-(Rational value) {
  77.     return { -value.Numerator(), value.Denominator()};
  78. }
  79.  
  80. Rational operator+(Rational value) {
  81.     return value;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement