有理数类通过分子分母存储分数,重载运算符实现加减乘除与比较,结合约分和最大公约数确保精度,避免浮点误差,支持如Rational(1,2)+Rational(1,3)输出"5/6"的精确计算。

在C++中实现一个有理数类(即分数类),可以通过操作符重载来支持加减乘除、比较等运算,从而实现分数的精确计算。避免浮点误差的关键是始终以分子/分母的形式保存数值,并在每次运算后约分。
1. 有理数类的基本结构
一个基本的有理数类需要包含分子和分母两个整型成员变量,并提供构造函数、约分功能以及必要的操作符重载。
class Rational {private:
int numerator; // 分子
int denominator; // 分母
void reduce(); // 约分函数
public:
Rational(int num = 0, int den = 1);
// 操作符重载声明
Rational operator+(const Rational&) const;
Rational operator-(const Rational&) const;
Rational operator*(const Rational&) const;
Rational operator/(const Rational&) const;
bool operator==(const Rational&) const;
bool operator
friend std::ostream& operator
};
2. 约分与构造函数实现
构造函数需确保分母不为零,并将分数化为最简形式。约分依赖于最大公约数(gcd)。
int gcd(int a, int b) {if (b == 0) return a;
return gcd(b, a % b);
}
void Rational::reduce() {
if (denominator
numerator = -numerator;
denominator = -denominator;
}
int g = gcd(abs(numerator), abs(denominator));
numerator /= g;
denominator /= g;
}
立即学习“C++免费学习笔记(深入)”;
Rational::Rational(int num, int den) {
if (den == 0) {
throw std::invalid_argument("分母不能为零");
}
numerator = num;
denominator = den;
reduce();
}
3. 实现四则运算操作符重载
通过重载 +、-、*、/ 操作符,可以像使用内置类型一样进行分数运算。
- 加法:a/b + c/d = (a*d + b*c)/(b*d)
- 减法:a/b - c/d = (a*d - b*c)/(b*d)
- 乘法:(a*c)/(b*d)
- 除法:(a*d)/(b*c),注意除数不能为零
Rational Rational::operator+(const Rational& rhs) const {
return Rational(
numerator rhs.denominator + denominator rhs.numerator,
denominator * rhs.denominator
);
}
Rational Rational::operator(const Rational& rhs) const {
return Rational(numerator rhs.numerator, denominator * rhs.denominator);
}
4. 比较与输出支持
重载比较操作符可判断两个分数是否相等或大小关系。输出流重载便于打印。
bool Rational::operator==(const Rational& rhs) const {return numerator == rhs.numerator && denominator == rhs.denominator;
}
bool Rational::operator
return numerator rhs.denominator rhs.numerator;
}
std::ostream& operator
if (r.denominator == 1) {
out
} else {
out
}
return out;
}
基本上就这些。通过操作符重载,你可以用 Rational a(1,2), b(1,3); cout 直接输出 "5/6",实现精确的分数计算,避免浮点精度问题。关键在于保持分数形式并及时约分。不复杂但容易忽略细节,比如负号统一到分子、除零检查等。基本上就这些。









