C++如何实现一个有理数类_C++通过操作符重载实现分数的精确计算

18次阅读

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

C++如何实现一个有理数类_C++通过操作符重载实现分数的精确计算

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″,实现精确的分数计算,避免浮点精度问题。关键在于保持分数形式并及时约分。不复杂但容易忽略细节,比如负号统一到分子、除零检查等。基本上就这些。

text=ZqhQzanResources