C/C++

Люди добрые, помогите

Необходимо Описать класс дробей — рациональных чисел, являющихся отношением двух целых чисел. Предусмотреть методы умножения и деления дробей. Перегрузить операции сравнения, сложения и вычитания (в С#)
#include <iostream>
using namespace std;
class Rational {
public:
using llong = long long;
Rational(llong n, llong d) : n_(n), d_(d) {
reduce_();
}
Rational mul(const Rational& x)const {
auto n = n_ * x.n_;
auto d = d_ * x.d_;
return Rational(n, d);
}
Rational div(const Rational& x)const {
auto n = n_ * x.d_;
auto d = d_ * x.n_;
return Rational(n, d);
}
private:
llong n_;
llong d_;
void reduce_() {
auto x = gcd_(n_, d_);
n_ /= x;
d_ /= x;
if (n_ < 0 && d_ < 0) {
n_ = abs(n_);
d_ = abs(d_);
}
}
llong gcd_(llong a, llong b) {
a = abs(a);
b = abs(b);
while (a != b) {
if (a > b) swap(a, b);
b = b - a;
}
return a;
}
Rational add(const Rational& x)const {
auto n = n_ * x.d_ + d_ * x.n_;
auto d = d_ * x.d_;
return Rational(n, d);
}
Rational sub(const Rational& x)const {
auto n = n_ * x.d_ - d_ * x.n_;
auto d = d_ * x.d_;
return Rational(n, d);
}
friend ostream& operator<<(ostream& out, const Rational& x) {
if (x.n_ < 0 || x.d_ < 0) out << '-';
out << '(' << abs(x.n_) << ", " << abs(x.d_) << ')';
return out;
}
friend Rational operator+(const Rational& a, const Rational& b) {
return a.add(b);
}
friend Rational operator-(const Rational& a, const Rational& b) {
return a.sub(b);
}
friend bool operator<(const Rational& a, const Rational& b) {
return double(a.n_) / double(a.d_) < double(b.n_) / double(b.d_);
}
friend bool operator==(const Rational& a, const Rational& b) {
return a.n_ == b.n_ && a.d_ == b.d_;
}
friend bool operator!=(const Rational& a, const Rational& b) {
return !(a == b);
}
friend bool operator<=(const Rational& a, const Rational& b) {
return a < b || a == b;
}
friend bool operator>(const Rational& a, const Rational& b) {
return !(a <= b);
}
friend bool operator>=(const Rational& a, const Rational& b) {
return !(a < b);
}
};
int main() {
Rational a(3, 8);
Rational b(2, 5);
auto add = a + b;
auto sub = a - b;
auto mul = a.mul(b);
auto div = a.div(b);
cout
<< a << " + " << b << " = " << add << '\n'
<< a << " - " << b << " = " << sub << '\n'
<< a << " * " << b << " = " << mul << '\n'
<< a << " / " << b << " = " << div << '\n';
if (a < b) puts("a < b");
if (a == b) puts("a == b");
if (a <= b) puts("a <= b");
if (a != b) puts("a != b ");
if (a >= b) puts("a >= b");
if (a > b) puts("a > b");
cin.get();
}
Валерий
Валерий
83 134
Лучший ответ
Павел Данилов if (n_ < 0 && d_ < 0) {
n_ = abs(n_);
d_ = abs(d_);
}
Знаменатель рационального числа не может быть отрицательным числом, так что более корректный вариант:
if (d_ < 0) {
n_ = -n_;
d_ = -d_;
}