This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub morioprog/cpplib
#include "math/fraction.hpp"
分数演算のための構造体.
Fraction f(4, 6); // 4/6(= 2/3)の値を持つ ~f; // 逆数を計算 (= 3/2) f.to_double(); // = 0.666666...
/** * @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; } };