A.cpp
unknown
c_cpp
a year ago
3.6 kB
23
Indexable
std::ostream& operator<<(std::ostream& os, const Fraction& p){ if(p) return os << p.nominator_ << "/" << p.denominator_; else return os << "NaN"; } Fraction::Fraction(){ nominator_ = 0; denominator_ = 1; } Fraction::Fraction(int nominator, int denominator){ nominator_ = nominator; denominator_ = denominator; if(denominator == 0){ nominator = 1; return; } if(denominator_ < 0){ denominator_ *= -1; nominator_ *= -1; } int gcd = std::gcd(abs(nominator_), denominator_); nominator_ /= gcd; denominator_ /= gcd; } Fraction Fraction::operator+(const Fraction &rhs) const{ if(rhs.denominator_ == 0 || this->denominator_ == 0){ return Fraction(1, 0); } int den = denominator_ * rhs.denominator_; int nom = nominator_ * rhs.denominator_ + rhs.nominator_ * denominator_; int gcd = std::gcd(abs(nom), den); return Fraction(nom / gcd, den / gcd); } Fraction Fraction::operator-(const Fraction &rhs) const{ if(rhs.denominator_ == 0 || this->denominator_ == 0){ return Fraction(1, 0); } int den = denominator_ * rhs.denominator_; int nom = nominator_ * rhs.denominator_ - rhs.nominator_ * denominator_; int gcd = std::gcd(abs(nom), den); return Fraction(nom / gcd, den / gcd); } Fraction Fraction::operator*(const Fraction &rhs) const{ if(rhs.denominator_ == 0 || this->denominator_ == 0){ return Fraction(1, 0); } int den = denominator_ * rhs.denominator_; int nom = nominator_ * rhs.nominator_; int gcd = std::gcd(abs(den), nom); return Fraction(nom / gcd, den / gcd); } Fraction Fraction::operator/(const Fraction &rhs) const{ if(rhs.denominator_ == 0 || this->denominator_ == 0){ return Fraction(1, 0); } int den = denominator_ * rhs.nominator_; int nom = nominator_ * rhs.denominator_; int gcd = std::gcd(abs(den), nom); return Fraction(nom / gcd, den / gcd); } bool Fraction::operator==(const Fraction &rhs) const{ if(this->denominator_ == 0 || rhs.denominator_ == 0) return 0; return denominator_ == rhs.denominator_ && nominator_ == rhs.nominator_; } bool Fraction::operator!=(const Fraction &rhs) const{ if(this->denominator_ == 0 || rhs.denominator_ == 0) return 0; return denominator_ != rhs.denominator_ || nominator_ != rhs.nominator_; } bool Fraction::operator<(const Fraction& rhs) const{ if(this->denominator_ == 0 || rhs.denominator_ == 0) return 0; Fraction diff = Fraction(this->nominator_, this->denominator_); diff = diff - rhs; return diff.nominator_ < 0; } bool Fraction::operator>(const Fraction& rhs) const{ if(this->denominator_ == 0 || rhs.denominator_ == 0) return 0; Fraction diff = Fraction(this->nominator_, this->denominator_); diff = diff - rhs; return diff.nominator_ > 0; } bool Fraction::operator<=(const Fraction& rhs) const{ if(this->denominator_ == 0 || rhs.denominator_ == 0) return 0; Fraction diff = Fraction(this->nominator_, this->denominator_); diff = diff - rhs; return diff.nominator_ <= 0; } bool Fraction::operator>=(const Fraction& rhs) const{ if(this->denominator_ == 0 || rhs.denominator_ == 0) return 0; Fraction diff = Fraction(this->nominator_, this->denominator_); diff = diff - rhs; return diff.nominator_ >= 0; } bool Fraction::IsNegative() const{ return (this->nominator_ < 0 && this->denominator_ != 0); } Fraction::operator bool() const{ return this->denominator_ != 0; }
Editor is loading...
Leave a Comment