自制簡單分數類

  簡單的分數類,可以進行與分數和整數的加減乘除運算和約分操作,稍微進行了下封裝。
  寫得還是比較簡單,乘法除法實現的時候爲了效率用了直接分子分母相乘最後在約分的辦法,如果分子分母太大的話可能有溢出的危險,小範圍內暫時不用考慮這個問題。
#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_
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章