【分数类】

【分数类】

struct Fraction {
private:
    i64 numerator;   // 分子
    i64 denominator; // 分母

    // 化简分数
    void reduce() {
        if (denominator == 0) {
            throw invalid_argument("分母不能为零");
        }

        // 确保分母为正数
        if (denominator < 0) {
            numerator *= -1;
            denominator *= -1;
        }

        // 约分
        i64 commonDivisor = gcd(numerator, denominator);
        if (commonDivisor != 0) {
            numerator /= commonDivisor;
            denominator /= commonDivisor;
        }

        // 分子为零时,分母固定为1
        if (numerator == 0) {
            denominator = 1;
        }
    }

public:
    // 构造函数
    Fraction(i64 num = 0, i64 den = 1) : numerator(num), denominator(den) {
        reduce();
    }

    // 拷贝构造函数
    Fraction(const Fraction& other) : numerator(other.numerator), denominator(other.denominator) {}

    // 判断是否为整数:分母为1时是整数
    bool isInteger() const {
        return denominator == 1;
    }

    // 加法运算
    Fraction operator+(const Fraction& other) const {
        i64 newDenominator = denominator * other.denominator;
        i64 newNumerator = numerator * other.denominator + other.numerator * denominator;
        return Fraction(newNumerator, newDenominator);
    }

    // 减法运算
    Fraction operator-(const Fraction& other) const {
        i64 newDenominator = denominator * other.denominator;
        i64 newNumerator = numerator * other.denominator - other.numerator * denominator;
        return Fraction(newNumerator, newDenominator);
    }

    // 乘法运算
    Fraction operator*(const Fraction& other) const {
        i64 newNumerator = numerator * other.numerator;
        i64 newDenominator = denominator * other.denominator;
        return Fraction(newNumerator, newDenominator);
    }

    // 除法运算
    Fraction operator/(const Fraction& other) const {
        if (other.numerator == 0) {
            throw invalid_argument("除数不能为零");
        }
        i64 newNumerator = numerator * other.denominator;
        i64 newDenominator = denominator * other.numerator;
        return Fraction(newNumerator, newDenominator);
    }

    // 赋值运算符
    Fraction& operator=(const Fraction& other) {
        if (this != &other) {
            numerator = other.numerator;
            denominator = other.denominator;
        }
        return *this;
    }

    // 输出运算符重载(友元函数)
    friend ostream& operator<<(ostream& os, const Fraction& f) {
        if (f.denominator == 1) {
            os << f.numerator;
        } else {
            os << f.numerator << " " << f.denominator;
        }
        return os;
    }

    // 获取分子
    i64 getNumerator() const { return numerator; }
    
    // 获取分母
    i64 getDenominator() const { return denominator; }
};
posted @ 2025-09-06 23:00  White_ink  阅读(4)  评论(0)    收藏  举报