当前版本
重载了四则运算
兼容了与整数的四则运算
重载了比较运算符>,>=,<,<=,==
重载了输出运算符
/*********************************************************************/
class Rational{
public:
Rational(ll num,ll denomi);
//运算符重载
friend Rational operator+(Rational x,Rational y);
friend Rational operator-(Rational x,Rational y);
friend Rational operator*(Rational x,Rational y);
friend Rational operator/(Rational x,Rational y);
//兼容和整数的运算
friend Rational operator+(Rational x,ll y);
friend Rational operator+(ll x,Rational y);
friend Rational operator-(Rational x,ll y);
friend Rational operator-(ll x,Rational y);
friend Rational operator*(Rational x,ll y);
friend Rational operator*(ll x,Rational y);
friend Rational operator/(Rational x,ll y);
friend Rational operator/(ll x,Rational y);
//重载比较运算符
friend bool operator>(Rational x,Rational y);
friend bool operator<(Rational x,Rational y);
friend bool operator>=(Rational x,Rational y);
friend bool operator<=(Rational x,Rational y);
friend bool operator==(Rational x,Rational y);
//重载输出运算符
friend ostream & operator<<(ostream &out, Rational &obj);
//gcd函数
ll gcd(ll a, ll b){return b ? gcd(b, a % b) : a;}
//归一化处理,比如将2/16变成1/8
void normalize();
public:
ll numerator;//分子
ll denominator;//分母
};
Rational::Rational(ll num=1,ll denomi=1){
numerator=num;
denominator=denomi;
normalize();
}
void Rational::normalize(){
if(denominator<0){//保证分母大于0
numerator=-numerator;
denominator=-denominator;
}
ll a = abs(numerator);
ll b = abs(denominator);
//求两个数的最大公约数
ll gc = gcd(a,b);
//分子,分母分别除以最大公约数,得到最简式
numerator/=gc;
denominator/=gc;
}
//运算符重载
//a c a*d+b*c
//— + — = ————
//b d b*d
Rational operator+(Rational x,Rational y){
ll a=x.numerator;
ll b=x.denominator;
ll c=y.numerator;
ll d=y.denominator;
ll e=a*d+c*b;
ll f=b*d;
return Rational(e,f);
}
Rational operator-(Rational x,Rational y){
y.numerator = -y.numerator;//减相当于加负数
return x + y;
}
//a c a*c
//— * — = ——
//b d b*d
Rational operator*(Rational x,Rational y){
ll a=x.numerator;
ll b=x.denominator;
ll c=y.numerator;
ll d=y.denominator;
ll e=a*c;
ll f=b*d;
return Rational(e,f);
}
//a c a*d
//— / — = ——
//b d b*c
Rational operator/(Rational x,Rational y){
ll a=x.numerator;
ll b=x.denominator;
ll c=y.numerator;
ll d=y.denominator;
ll e=a*d;
ll f=b*c;
return Rational(e,f);
}
//兼容和整数的运算
Rational operator+(Rational x,ll y){
return x + Rational(y,1);
}
Rational operator+(ll x,Rational y){
return Rational(x,1) + y;
}
Rational operator-(Rational x,ll y){
return x - Rational(y,1);
}
Rational operator-(ll x,Rational y){
return Rational(x,1) + y;
}
Rational operator*(Rational x,ll y){
return x*Rational(y,1);
}
Rational operator*(ll x,Rational y){
return Rational(x,1) * y;
}
Rational operator/(Rational x,ll y){
return x / Rational(y,1);
}
Rational operator/(ll x,Rational y){
return Rational(x,1) / y;
}
//比较运算符重载
bool operator>(Rational x,Rational y){
Rational cha = x - y;
return cha.numerator > 0;
}
bool operator<(Rational x,Rational y){
Rational cha = x - y;
return cha.numerator < 0;
}
bool operator>=(Rational x,Rational y){
Rational cha = x - y;
return cha.numerator >= 0;
}
bool operator<=(Rational x,Rational y){
Rational cha = x - y;
return cha.numerator <= 0;
}
bool operator==(Rational x,Rational y){
Rational cha = x - y;
return cha.numerator == 0;
}
//输出运算符重载
ostream & operator<<(ostream &out, Rational &obj){
if(obj.numerator == 0)
cout<<obj.numerator;
else if(obj.denominator == 1)
cout<<obj.numerator;
else
cout<<obj.numerator<<'/'<<obj.denominator;
return out;
}
/***********************************************************/
之前版本
class Rational{
public:
Rational(ll num,ll denomi);
Rational operator+(Rational x);//运算符重载
Rational operator-(Rational x);
Rational operator*(Rational x);
Rational operator/(Rational x);
friend ostream & operator<<(ostream &out, Rational &obj);
public:
ll numerator;//分子
ll denominator;//分母
void normalize();//归一化处理,比如将2/16变成1/8
};
Rational::Rational(ll num=1,ll denomi=1)
{
numerator=num;
denominator=denomi;
normalize();
}
void Rational::normalize()
{
if(denominator<0)
{
numerator=-numerator;
denominator=-denominator;
}
//欧几里得算法
ll a = abs(numerator);
ll b = abs(denominator);
//求两个数的最大公约数
while(b>0)
{
ll t=a%b;
a=b;
b=t;
}
//分子,分母分别除以最大公约数,得到最简式子
numerator/=a;
denominator/=a;
}
//a c a*d+b*c
//— + — = ——————
//b d b*d
Rational Rational::operator+(Rational x)
{
ll a=numerator;
ll b=denominator;
ll c=x.numerator;
ll d=x.denominator;
ll e=a*d+c*b;
ll f=b*d;
return Rational(e,f);
}
Rational Rational::operator-(Rational x)
{
x.numerator=-x.numerator;//减相当于加负数
return operator+(x);
}
//a c a*c
//— * — = ——————
//b d b*d
Rational Rational::operator*(Rational x)
{
ll a=numerator;
ll b=denominator;
ll c=x.numerator;
ll d=x.denominator;
ll e=a*c;
ll f=b*d;
return Rational(e,f);
}
//a c a*d
//— / — = ——————
//b d b*c
Rational Rational::operator/(Rational x)
{
ll a=numerator;
ll b=denominator;
ll c=x.numerator;
ll d=x.denominator;
ll e=a*d;
ll f=b*c;
return Rational(e,f);
}
ostream & operator<<(ostream &out, Rational &obj)
{
//if(numerator%denominator==0)
// cout<<numerator/denominator;
//else
cout<<obj.numerator<<'/'<<obj.denominator;
return out;
}