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