#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;
}
CPP2023-029-运算符重载 6-6 分数(代码补充)
于 2023-12-22 17:44:09 首次发布