分数类(重载了四则运算、比较运算、输出)

本文详细介绍了如何在C++中为Rational类重载四则运算符和比较运算符,包括与整数运算的兼容性处理,以及运算符重载的具体实现方法。此外,还展示了如何通过归一化处理简化分数表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 当前版本

重载了四则运算

兼容了与整数的四则运算

重载了比较运算符>,>=,<,<=,==

重载了输出运算符

/*********************************************************************/
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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值