Skip to content

Instantly share code, notes, and snippets.

@asSqr
Created December 16, 2019 05:23
Show Gist options
  • Save asSqr/e7d2a80b91fc450794b87175236c64be to your computer and use it in GitHub Desktop.
Save asSqr/e7d2a80b91fc450794b87175236c64be to your computer and use it in GitHub Desktop.
#ifndef RATIONAL_NUM
#define RATIONAL_NUM
#include <sstream>
#include <string>
class Rational {
public:
Rational()
: num(0), den(1)
{}
Rational( int num, int den = 1 )
: num(num), den(den)
{}
Rational operator+ ( const Rational &r )
{
Rational l = *this;
Rational ret;
ret.den = lcm( l.den, r.den );
ret.num = l.num*ret.den/l.den+r.num*ret.den/r.den;
return ret;
}
Rational operator- ( const Rational &r )
{
Rational l = *this;
Rational ret;
ret.den = lcm( l.den, r.den );
ret.num = l.num*ret.den/l.den-r.num*ret.den/r.den;
return ret;
}
Rational operator* ( const Rational &r )
{
Rational l = *this;
Rational ret;
ret.den = l.den*r.den;
ret.num = l.num*r.num;
return ret;
}
Rational operator/ ( const Rational &r )
{
Rational l = *this;
Rational ret;
ret.den = l.den*r.num;
ret.num = l.num*r.den;
return ret;
}
Rational& operator+= ( const Rational &r )
{
Rational l = *this;
this->den = lcm( l.den, r.den );
this->num = l.num*this->den/l.den+r.num*this->den/r.den;
return *this;
}
Rational& operator-= ( const Rational &r )
{
Rational l = *this;
this->den = lcm( l.den, r.den );
this->num = l.num*this->den/l.den-r.num*this->den/r.den;
return *this;
}
Rational& operator*= ( const Rational &r )
{
Rational l = *this;
this->den = l.den*r.den;
this->num = l.num*r.num;
return *this;
}
Rational& operator/= ( const Rational &r )
{
Rational l = *this;
this->den = l.den*r.num;
this->num = l.num*r.den;
return *this;
}
int getDenominator() const
{ return den; }
int getNumerator() const
{ return num; }
std::string toString() const
{
std::ostringstream oss;
oss << num;
oss << "/";
oss << den;
return oss.str();
}
void simplify()
{
int g = gcd( this->den, this->num );
this->den /= g;
this->num /= g;
return;
}
private:
int den, num;
int gcd( int a, int b )
{ return b ? gcd(b,a%b) : a; }
int lcm( int a, int b )
{ return a/gcd(a,b)*b; }
};
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment