CPP2023-029-运算符重载 6-6 分数(代码补充)

#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;

long long gcd(long long a, long long b) {
    return b == 0 ? a : gcd(b, a % b);
}

class Fraction {
private:
    long long numerator;
    long long denominator;

public:
    Fraction() : numerator(0), denominator(1) {}

    Fraction(long long num, long long denom) {
        long long common = gcd(num, denom);
        numerator = num / common;
        denominator = denom / common;
    }

    Fraction(double d) {
        long long num = static_cast<long long>(d * 1e16);
        long long denom = 1e16;
        long long common = gcd(num, denom);
        numerator = num / common;
        denominator = denom / common;
    }

    friend istream &operator>>(istream &in, Fraction &f) {
        string input;
        in >> input;
        stringstream ss(input);
        long long num, denom;
        char slash;
        ss >> num >> slash >> denom;
        f = Fraction(num, denom);
        return in;
    }

    friend ostream &operator<<(ostream &out, const Fraction &f) {
        out << f.numerator << "/" << f.denominator;
        return out;
    }

    Fraction operator+(const Fraction &other) const {
        long long num = numerator * other.denominator + other.numerator * denominator;
        long long denom = denominator * other.denominator;
        long long common = gcd(num, denom);
        return Fraction(num / common, denom / common);
    }

    Fraction operator-(const Fraction &other) const {
        long long num = numerator * other.denominator - other.numerator * denominator;
        long long denom = denominator * other.denominator;
        long long common = gcd(num, denom);
        return Fraction(num / common, denom / common);
    }

    Fraction operator*(const Fraction &other) const {
        long long num = numerator * other.numerator;
        long long denom = denominator * other.denominator;
        long long common = gcd(num, denom);
        return Fraction(num / common, denom / common);
    }

    Fraction operator/(const Fraction &other) const {
        long long num = numerator * other.denominator;
        long long denom = denominator * other.numerator;
        long long common = gcd(num, denom);
        return Fraction(num / common, denom / common);
    }

    operator double() const {
        return static_cast<double>(numerator) / denominator;
    }

    Fraction &operator=(double d) {
        long long num = static_cast<long long>(d * 1e16);
        long long denom = 1e16;
        long long common = gcd(num, denom);
        numerator = num / common;
        denominator = denom / common;
        return *this;
    }

    Fraction operator*(double d) const {
        long long num = static_cast<long long>(numerator * d);
        long long denom = denominator;
        long long common = gcd(num, denom);
        return Fraction(num / common, denom / common);
    }
};

int main(void)
{
    Fraction f1;
    Fraction f2;
    cin >> f1 >> f2;
    cout << f1+f2 << endl;
    cout << (double)(f1+f2) << endl;
    cout << f1-f2 << endl;
    cout << f1*f2 << endl;
    cout << f2/f1 << endl;
    double d;
    cin >> d;
    Fraction f((long long)(d*1e16), 1e16);
    cout << f << endl;
    f=0.5;
    cout << f << endl;
    Fraction*p = &f1;
    f1=*p;
    cout << f1 << endl;
    cin >> f1;
    f1 = f1*Fraction(2.0);
    /*
    在上面的代码中,f1 = f1 * Fraction(2.0);这行代码是将f1乘以一个浮点数2.0,
	然后将结果赋值给f1。在Fraction类中,我们已经重载了乘法运算符*,
	使得可以将Fraction对象与浮点数相乘。当执行f1 = f1 * Fraction(2.0);时,
	首先将f1乘以2.0得到一个新的Fraction对象,然后将这个新的Fraction对象赋值给f1。
    */
    cout << f1 << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值