自制简单分数类

  简单的分数类,可以进行与分数和整数的加减乘除运算和约分操作,稍微进行了下封装。
  写得还是比较简单,乘法除法实现的时候为了效率用了直接分子分母相乘最后在约分的办法,如果分子分母太大的话可能有溢出的危险,小范围内暂时不用考虑这个问题。
#ifndef _Fraction_H_
#define _Fraction_H_
class Fraction {
private:
    long long _a, _b;
public:
    Fraction(const int &a = 0, const int &b = 1) : _a(a), _b(b) {}
    Fraction(const Fraction &f) : _a(f.numerator()), _b(f.denominator()) {}
public:
    long long& numerator() { return _a; } // 分子
    long long& denominator() { return _b; } // 分母
    const long long& numerator() const { return _a; } // 分子
    const long long& denominator() const { return _b; } // 分母
public:
    long long numerator(const int &a) { return _a = a; } // 修改分子的值
    long long denominator(const int &b) { return _b = b; } // 修改分母的值
    Fraction fraction(const int &a, const int &b) { _a = a, _b = b; return *this; } // 修改分数的值
public:
    bool operator == (const Fraction &f) const { return numerator() * f.denominator() == denominator() * f.numerator(); }
    bool operator != (const Fraction &f) const { return !(*this == f); }
    bool operator < (const Fraction &f) const { return numerator() * f.denominator() < denominator() * f.numerator(); }
    bool operator <= (const Fraction &f) const { return numerator() * f.denominator() <= denominator() * f.numerator(); }
    bool operator > (const Fraction &f) const { return numerator() * f.denominator() > denominator() * f.numerator(); }
    bool operator >= (const Fraction &f) const { return numerator() * f.denominator() >= denominator() * f.numerator(); }
private:
    long long _gcd(long long a, long long b) const { // 最大公约数
        long long t;
        if(a < 0) a = -a;
        while(b) t = b, b = a % b, a = t;
        return a;
    }
public:
    Fraction& reduction_self() { // 约分(修改自身的值)
        long long g = _gcd(_a, _b);
        _a /= g, _b /= g;
        return *this;
    }
    Fraction reduction() const { // 约分(返回结果)
        long long g = _gcd(_a, _b);
        return Fraction(_a / g, _b / g);
    }
    bool can_reduct() const { // 判断是否能约分
        return _gcd(_a, _b) == 1;
    }
public:
    Fraction operator + (const Fraction &f) const { // 和分数的加法
        long long g = _gcd(_b, f.denominator());
        Fraction ans(_a * f.denominator()/ g + f.numerator()* _b / g, _b / g * f.denominator());
        return ans.reduction_self();
    }
    Fraction operator + (const long long &ll) const { // 和整数的加法
        return *this + Fraction(ll, 1);
    }
    friend Fraction operator + (const long long &ll, const Fraction &f) { // 和整数的加法
        return Fraction(ll, 1) + f;
    }
    Fraction operator - (const Fraction &f) const { // 和分数的减法
        long long g = _gcd(_b, f.denominator());
        Fraction ans(_a * f.denominator()/ g - f.numerator()* _b / g, _b / g * f.denominator());
        return ans.reduction_self();
    }
    Fraction operator - (const long long &ll) const { // 和整数的减法
        return *this - Fraction(ll, 1);
    }
    friend Fraction operator - (const long long &ll, const Fraction &f) { // 和整数的减法
        return Fraction(ll, 1) - f;
    }
    Fraction operator * (const Fraction &f) const { // 和分数的乘法
        Fraction ans(_a * f.numerator(), _b * f.denominator());
        return ans.reduction_self();
    }
    Fraction operator * (const long long &ll) const { // 和整数的乘法
        Fraction ans(_a * ll, _b);
        return ans.reduction_self();
    }
    friend Fraction operator * (const long long &ll, const Fraction &f) { // 和整数的乘法
        return f * ll;
    }
    Fraction operator / (const Fraction &f) const  { // 和分数的除法
        Fraction ans(_a * f.denominator(), _b * f.numerator());
        return ans.reduction_self();
    }
    Fraction operator / (const long long &ll) const { // 和整数的除法
        Fraction ans(_a, _b * ll);
        return ans.reduction_self();
    }
    friend Fraction operator / (const long long &ll, const Fraction &f) { // 和整数的除法
        Fraction ans(ll * f.denominator(), f.numerator());
        return ans.reduction_self();
    }
};
#endif // _Fraction_H_
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章