类(运算符重载)实现有理数的加减乘除

在这里插入图片描述
补充概念:有理数 = 可以用分数表达的数

代码如下:

#include <iostream>
#include <cmath>
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
class Rational
{
	public:
		Rational(int num,int denom); // num =分子,denom =分母
		Rational operator +(Rational rhs);
		Rational operator -(Rational rhs);
		Rational operator *(Rational rhs);
		Rational operator /(Rational rhs);
		void print();
	private:
		void hj(); //负责对分数的简化处理
		int fz; // 分子
		int fm; // 分母
};
Rational::Rational(int num,int denom )
{
	fz = num;
	fm = denom;
	hj();
}
// hj()对分数进行简化的操作包括:
// 1.只允许分子为负数,如果分母为负数则把负数挪到分子部分,如 1/-2 == -1/2
// 2.表示最简分数:A / B = (A/gcd(A,B)) / (B/gcd(A,B)),只要把 A,B最大公约数去除掉就可以了
void Rational::hj()
{
	//确保分母为正
	if(fm<0)
	{
	fz = -fz;
	fm = -fm;
	}
	//欧几里德算法
	int a = abs (fz);
	int b = abs (fm);
	//求出最大公约数
	int gcd_max = gcd(a,b);
	//分子、分母分别除以最大公约数得到最简化分数
	fz /= gcd_max;
	fm /= gcd_max;
}
//a   c   a*d   c*b   a*d + c*b
//- + - = --- + --- = ---------
//b   d   b*d   b*d      b*d
Rational Rational::operator +(Rational rhs )
{
	int a = fz ;
	int b = fm;
	int c = rhs.fz;
	int d = rhs.fm;
	int e = a*b + c*d;
	int f = b*d;
	return Rational(e,f);
}
//a   c   a   -c
//- - - = - + --
//b   d   b   d
Rational Rational::operator -(Rational rhs) //分子变成负数,再使用加法函数
{
	rhs.fz = -rhs.fz;
	return operator +(rhs);
}
//a   c   a*c
//- * - = ---
//b   d   b*d
Rational Rational:: operator *(Rational rhs)
{
	int a = fz;
	int b = fm;
	int c = rhs.fz;
	int d = rhs.fm;
	
	int e = a*c;
	int f = b*d;
	return Rational(e,f);
}
//a   c   a   d
//- / - = - * -
//b   d   b   c
Rational Rational:: operator /(Rational rhs) //分子分母倒过来,再使用乘法函数
{
	int t = rhs.fz;
	rhs.fz = rhs.fm;
	rhs.fm = t;
	return operator*(rhs) ;
}
void Rational::print() //判断输入整数还是分数
{
	if( fz % fm == 0 )
	std::cout << fz / fm;
	else
	std::cout << fz << "/" << fm;
}
int main()
{
	Rational f1(2,16);
	Rational f2(7,8);
	//测试有理数加法运算
	Rational res = f1 + f2;
	f1.print();
	std::cout <<" + ";
	f2.print();
	std::cout <<" = ";
	res.print();
	std::cout <<"\n";
	// 测试有理数减法运算
	res=f1-f2;
	f1.print();
	std::cout <<" - ";
	f2.print();
	std::cout <<" = ";
	res.print();
	return 0;
}

纯手打…不容易

output:
1/8 + 7/8 = 1
1/8 - 7/8 = -3/4
发布了92 篇原创文章 · 获赞 35 · 访问量 6368

猜你喜欢

转载自blog.csdn.net/CourserLi/article/details/103664198
今日推荐