#include<iostream>
#include<cmath>
using namespace std;
class Fraction {
    private:
        int numerator;
        int denominator;
    public:
        Fraction(int n = 0, int d = 1) {
            numerator = n;
            denominator = d;
        }
        int gcd(int a, int b) {
            if (b == 0) {
                return a;
            } else {
                return gcd(b, a % b);
            }
        }
        void simplify() {
            int common = gcd(abs(numerator), abs(denominator));
            numerator /= common;
            denominator /= common;
            if (denominator < 0) {
                numerator *= -1;
                denominator *= -1;
            }
        }
        operator double() {
            return (double)numerator / denominator;
        }
        friend ostream& operator <<(ostream& out, const Fraction& f);
        friend istream& operator >>(istream& in, Fraction& f);
        friend Fraction operator +(const Fraction& f1, const Fraction& f2);
        friend Fraction operator -(const Fraction& f1, const Fraction& f2);
        friend Fraction operator *(const Fraction& f1, const Fraction& f2);
        friend Fraction operator /(const Fraction& f1, const Fraction& f2);
        friend Fraction operator +(const Fraction& f1, const int& i);
        friend Fraction operator -(const Fraction& f1, const int& i);
        friend Fraction operator *(const Fraction& f1, const int& i);
        friend Fraction operator /(const Fraction& f1, const int& i);
        friend Fraction operator +(const int& i, const Fraction& f2);
        friend Fraction operator -(const int& i, const Fraction& f2);
        friend Fraction operator *(const int& i, const Fraction& f2);
        friend Fraction operator /(const int& i, const Fraction& f2);
};
ostream& operator <<(ostream& out, const Fraction& f) {
    out << f.numerator << '/' << f.denominator;
    return out;
}

istream& operator >>(istream& in, Fraction& f) {
    char slash;
    in >> f.numerator >> slash >> f.denominator;
    f.simplify();
    return in;
}

Fraction operator +(const Fraction& f1, const Fraction& f2) {
    int num = f1.numerator * f2.denominator + f2.numerator * f1.denominator;
    int den = f1.denominator * f2.denominator;
    Fraction result(num, den);
    result.simplify();
    return result;
}

Fraction operator -(const Fraction& f1, const Fraction& f2) {
    int num = f1.numerator * f2.denominator - f2.numerator * f1.denominator;
    int den = f1.denominator * f2.denominator;
    Fraction result(num, den);
    result.simplify();
    return result;
}

Fraction operator *(const Fraction& f1, const Fraction& f2) {
    int num = f1.numerator * f2.numerator;
    int den = f1.denominator * f2.denominator;
    Fraction result(num, den);
    result.simplify();
    return result;
}

Fraction operator /(const Fraction& f1, const Fraction& f2) {
    int num = f1.numerator * f2.denominator;
    int den = f1.denominator * f2.numerator;
    Fraction result(num, den);
    result.simplify();
    return result;
}

Fraction operator +(const Fraction& f1, const int& i) {
    Fraction f2(i);
    return f1 + f2;
}

Fraction operator -(const Fraction& f1, const int& i) {
    Fraction f2(i);
    return f1 - f2;
}

Fraction operator *(const Fraction& f1, const int& i) {
    Fraction f2(i);
    return f1 * f2;
}

Fraction operator /(const Fraction& f1, const int& i) {
    Fraction f2(i);
    return f1 / f2;
}

Fraction operator +(const int& i, const Fraction& f2) {
    Fraction f1(i);
    return f1 + f2;
}

Fraction operator -(const int& i, const Fraction& f2) {
    Fraction f1(i);
    return f1 - f2;
}

Fraction operator *(const int& i, const Fraction& f2) {
    Fraction f1(i);
    return f1 * f2;
}

Fraction operator /(const int& i, const Fraction& f2) {
    Fraction f1(i);
    return f1 / f2;
}

int main() {
    Fraction f1(3, 4);
    Fraction f2(1, 2);
    Fraction f3 = f1 + f2;
    cout << f3 << endl; // 输出 5/4
    Fraction f4 = f1 - f2;
    cout << f4 << endl; // 输出 1/4
    Fraction f5 = f1 * f2;
    cout << f5 << endl; // 输出 3/8
    Fraction f6 = f1 / f2;
    cout << f6 << endl; // 输出 3/2
    Fraction f7 = f1 + 2;
    cout << f7 << endl; // 输出 11/4
    Fraction f8 = f1 - 2;
    cout << f8 << endl; // 输出 -5/4
    Fraction f9 = f1 * 2;
    cout << f9 << endl; // 输出 3/2
    Fraction f10 = f1 / 2;
    cout << f10 << endl; // 输出 3/8
    Fraction f11 = 2 + f1;
    cout << f11 << endl; // 输出 11/4
    Fraction f12 = 2 - f1;
    cout << f12 << endl; // 输出 5/4
    Fraction f13 = 2 * f1;
    cout << f13 << endl; // 输出 3/2
    Fraction f14 = 2 / f1;
    cout << f14 << endl; // 输出 8/3
    double d = f1;
    cout << d << endl; // 输出 0.75
    Fraction f15;
    cin >> f15; // 输入 2/3
    cout << f15 << endl; // 输出 2/3
    return 0;
}

原文地址: https://www.cveoy.top/t/topic/kWxv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录