cpplib

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub morioprog/cpplib

:heavy_check_mark: Fraction (分数)
(math/fraction.hpp)

概要

分数演算のための構造体.

使用例

Fraction f(4, 6);   // 4/6(= 2/3)の値を持つ
~f;                 // 逆数を計算 (= 3/2)
f.to_double();      // = 0.666666...

Verified with

Code

/**
 * @brief Fraction (分数)
 * @docs docs/math/fraction.md
 */

template <typename T = long long>
struct Fraction {
    T numer, denom;
    T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
    Fraction(T n = 0, T d = 1) {
        T g = gcd(n, d);
        assert(d != 0);
        numer = n / g, denom = d / g;
        if (denom < 0) numer *= -1, denom *= -1;
    }
    Fraction operator+(const Fraction &f) const { return Fraction(numer * f.denom + denom * f.numer, denom * f.denom); }
    Fraction operator-(const Fraction &f) const { return Fraction(numer * f.denom - denom * f.numer, denom * f.denom); }
    Fraction operator*(const Fraction &f) const { return Fraction(numer * f.numer, denom * f.denom); }
    Fraction operator/(const Fraction &f) const { return Fraction(numer * f.denom, denom * f.numer); }
    Fraction &operator+=(const Fraction &f) { return *this = *this + f; }
    Fraction &operator-=(const Fraction &f) { return *this = *this - f; }
    Fraction &operator*=(const Fraction &f) { return *this = *this * f; }
    Fraction &operator/=(const Fraction &f) { return *this = *this / f; }
    Fraction operator~() const { return Fraction(denom, numer); }
    bool operator<(const Fraction &f) const { return numer * f.denom < f.numer * denom; }
    bool operator>(const Fraction &f) const { return numer * f.denom > f.numer * denom; }
    bool operator==(const Fraction &f) const { return numer == f.numer && denom == f.denom; }
    bool operator!=(const Fraction &f) const { return numer != f.numer || denom != f.denom; }
    bool operator<=(const Fraction &f) const { return numer * f.denom <= f.numer * denom; }
    bool operator>=(const Fraction &f) const { return numer * f.denom >= f.numer * denom; }
    double to_double() const { return (double)numer / denom; }
    friend ostream &operator<<(ostream &os, const Fraction &f) { return os << f.numer << " / " << f.denom; }
};
#line 1 "math/fraction.hpp"
/**
 * @brief Fraction (分数)
 * @docs docs/math/fraction.md
 */

template <typename T = long long>
struct Fraction {
    T numer, denom;
    T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
    Fraction(T n = 0, T d = 1) {
        T g = gcd(n, d);
        assert(d != 0);
        numer = n / g, denom = d / g;
        if (denom < 0) numer *= -1, denom *= -1;
    }
    Fraction operator+(const Fraction &f) const { return Fraction(numer * f.denom + denom * f.numer, denom * f.denom); }
    Fraction operator-(const Fraction &f) const { return Fraction(numer * f.denom - denom * f.numer, denom * f.denom); }
    Fraction operator*(const Fraction &f) const { return Fraction(numer * f.numer, denom * f.denom); }
    Fraction operator/(const Fraction &f) const { return Fraction(numer * f.denom, denom * f.numer); }
    Fraction &operator+=(const Fraction &f) { return *this = *this + f; }
    Fraction &operator-=(const Fraction &f) { return *this = *this - f; }
    Fraction &operator*=(const Fraction &f) { return *this = *this * f; }
    Fraction &operator/=(const Fraction &f) { return *this = *this / f; }
    Fraction operator~() const { return Fraction(denom, numer); }
    bool operator<(const Fraction &f) const { return numer * f.denom < f.numer * denom; }
    bool operator>(const Fraction &f) const { return numer * f.denom > f.numer * denom; }
    bool operator==(const Fraction &f) const { return numer == f.numer && denom == f.denom; }
    bool operator!=(const Fraction &f) const { return numer != f.numer || denom != f.denom; }
    bool operator<=(const Fraction &f) const { return numer * f.denom <= f.numer * denom; }
    bool operator>=(const Fraction &f) const { return numer * f.denom >= f.numer * denom; }
    double to_double() const { return (double)numer / denom; }
    friend ostream &operator<<(ostream &os, const Fraction &f) { return os << f.numer << " / " << f.denom; }
};
Back to top page