分数的加减乘除

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值