补充概念:有理数 = 可以用分数表达的数
代码如下:
#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