#include <iostream>
#include <math.h>
using namespace std;
class Rational {
private:
int x,y; //成员变量 x 和 y,分别存放分子和分母
public:
Rational(int a=1,int b=1); //具有默认参数的构造函数,默认值为 1
Rational Add(Rational &r); //求两个分数的和
Rational Sub(Rational &r); //求两个分数的差
Rational Mul(Rational &r); //求两个分数的积
Rational Div(Rational &r); //求两个分数的商
Rational operator+(Rational &r); //重载“+”运算符,求两个分数的和
Rational operator-(Rational &r); //重载“-”运算符,求两个分数的差
Rational operator*(Rational &r); //重载“*”运算符,求两个分数的积
Rational operator/(Rational &r); //重载“/”运算符,求两个分数的商
int Divisor(int a,int b); //求最大公约数
friend ostream& operator<<(ostream &output,Rational &r); //以 x/y 的形式输出分数
};
Rational::Rational(int a,int b) {
this->x=a;
this->y=b;
}
Rational Rational::Add(Rational &r) {
Rational c;
int gcd=r.Divisor(this->y,r.y);
int temp= this->y*r.y/gcd;
c.y=temp;
c.x=temp/this->y*this->x+temp/r.y*r.x;
return c;
}
Rational Rational::Sub(Rational &r) {
Rational c;
int gcd=r.Divisor(this->y,r.y);
int temp= this->y*r.y/gcd;
c.y=temp;
c.x=temp/this->y*this->x-temp/r.y*r.x;
return c;
}
Rational Rational::Mul(Rational &r) {
Rational c;
c.x=this->x*r.x;
c.y=this->y*r.y;
int Temp=r.Divisor(c.x,c.y);
c.x/=Temp;
c.y/=Temp;
return c;
}
Rational Rational::Div(Rational &r) {
Rational c;
c.x=this->x*r.y;
c.y=this->y*r.x;
int Temp=r.Divisor(c.x,c.y);
c.x/=Temp;
c.y/=Temp;
return c;
}
int Rational::Divisor(int a,int b) {
return b?Divisor(b,a%b):a;
}
Rational Rational::operator+(Rational &r) {
Rational c;
int gcd=r.Divisor(this->y,r.y);
int temp= this->y*r.y/gcd;
c.y=temp;
c.x=temp/this->y*this->x+temp/r.y*r.x;
return c;
}
Rational Rational::operator-(Rational &r) {
Rational c;
int gcd=r.Divisor(this->y,r.y);
int temp= this->y*r.y/gcd;
c.y=temp;
c.x=temp/this->y*this->x-temp/r.y*r.x;
return c;
}
Rational Rational::operator*(Rational &r) {
Rational c;
c.x=this->x*r.x;
c.y=this->y*r.y;
int Temp=r.Divisor(c.x,c.y);
c.x/=Temp;
c.y/=Temp;
return c;
}
Rational Rational::operator/(Rational &r) {
Rational c;
c.x=this->x*r.y;
c.y=this->y*r.x;
int Temp=r.Divisor(c.x,c.y);
c.x/=Temp;
c.y/=Temp;
return c;
}
ostream& operator<<(ostream &output,Rational &r) {
int temp=r.Divisor(r.x,r.y);
r.x/=temp;
r.y/=temp;
if(r.x<0&&r.y<0)
output<<abs(r.x)<<"/"<<abs(r.y);
else if(r.x>0&&r.y<0)
output<<"-"<<abs(r.x)<<"/"<<abs(r.y);
else
output<<r.x<<"/"<<r.y;
}
int main() {
Rational a(5,15),b(1,-2),c;
cout<<"初始值(a,b):"<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"成员函数:"<<endl;
c=a.Add(b); //c=a+b;
cout<<"a+b="<<c<<endl;
c=a.Sub(b); //c=a-b;
cout<<"a-b="<<c<<endl;
c=a.Mul(b); //c=a*b;
cout<<"a*b="<<c<<endl;
c=a.Div(b); //c=a/b;
cout<<"a/b="<<c<<endl;
cout<<"运算符重载计算结果:"<<endl;
c=a+b;
cout<<"a+b="<<c<<endl;
c=a-b;
cout<<"a-b="<<c<<endl;
c=a*b;
cout<<"a*b="<<c<<endl;
c=a/b;
cout<<"a/b="<<c<<endl;
return 0;
}