class Rational
{
    static inline int gcd(int a, int b)
    {
        if (!b) return abs(a);
        while ((a %= b) && (b %= a)) ; // do in while
        return a + b;
    }

public:
    static const Rational Infinity;
    static const Rational Nan;

    Rational(int numerator, int denominator)
        : n(numerator), d(denominator) { symplify(); }
    constexpr Rational(int number) : n(number), d(1) {}
    constexpr Rational() : n(0), d(1) {}

    const Rational &operator=(const Rational &other)
    {
        n = other.n;
        d = other.d;
        return *this;
    }

    const int numerator() const { return n; }
    const int denominator() const { return d; }

private:
    void symplify()
    {
        int cd = gcd(n, d);
        if (cd) {
            n /= cd;
            d /= cd;
        }
        if (d < 0) {
            n = -n;
            d = -d;
        }
    }
    int n, d;
};
const Rational Rational::Infinity = Rational(1, 0);
const Rational Rational::Nan = Rational(0, 0);

inline const Rational operator-(const Rational &a)
{ return Rational(-a.numerator(), a.denominator()); }
inline const Rational operator+(const Rational &a, const Rational &b)
{
    return Rational(a.numerator() * b.denominator() +
                        a.denominator() * b.numerator(),
                    a.denominator() * b.denominator());
}
inline const Rational operator-(const Rational &a, const Rational &b)
{ return a + -b; }
inline const Rational operator*(const Rational &a, const Rational &b)
{
    return Rational(a.numerator() * b.numerator(),
                    a.denominator() * b.denominator());
}
inline const Rational operator/(const Rational &a, const Rational &b)
{
    return Rational(a.numerator() * b.denominator(),
                    a.denominator() * b.numerator());
}

std::ostream &operator<<(std::ostream &os, const Rational &r)
{
    switch (r.denominator())
    {
    case 0:
        if (r.numerator() == 0) return os << "NaN";
        if (r.numerator() < 0) os << '-';
        return os << "Inf";
    case 1:
        return os << r.numerator();
    default:
        return os << '(' << r.numerator() << '/' << r.denominator() << ')';
    }
}

void test_rational()
{
    Rational a(6, -2);
    cout << a << '\n';
    cout << Rational(9, 33) + 5 << '\n';
    cout << Rational(-9, 33) * 2 << '\n';
    cout << Rational(-9, -33) - 1 << '\n';
    cout << Rational(9, -33) / 8 << '\n';
    cout << 1 / Rational(9, -33) << '\n';
    cout << "-----Inf------\n";
    cout << a * -Rational::Infinity << '\n';
    cout << a * - -Rational::Infinity << '\n';
    cout << a + Rational::Infinity << '\n';
    cout << a - Rational::Infinity << '\n';
    cout << "-----NaN------\n";
    cout << Rational::Nan - Rational::Infinity << '\n';
    cout << a * Rational::Nan << '\n';
    cout << a / Rational::Nan << '\n';
    cout << a + Rational::Nan << '\n';
    cout << a - Rational::Nan << '\n';
}

原文地址:http://www.cnblogs.com/violeshnv/p/16831728.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性