自制简单分数类

  简单的分数类,可以进行与分数和整数的加减乘除运算和约分操作,稍微进行了下封装。
  写得还是比较简单,乘法除法实现的时候为了效率用了直接分子分母相乘最后在约分的办法,如果分子分母太大的话可能有溢出的危险,小范围内暂时不用考虑这个问题。
#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_
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值