【分数类】
struct Fraction {
private:
i64 numerator; // 分子
i64 denominator; // 分母
// 化简分数
void reduce() {
if (denominator == 0) {
throw invalid_argument("分母不能为零");
}
// 确保分母为正数
if (denominator < 0) {
numerator *= -1;
denominator *= -1;
}
// 约分
i64 commonDivisor = gcd(numerator, denominator);
if (commonDivisor != 0) {
numerator /= commonDivisor;
denominator /= commonDivisor;
}
// 分子为零时,分母固定为1
if (numerator == 0) {
denominator = 1;
}
}
public:
// 构造函数
Fraction(i64 num = 0, i64 den = 1) : numerator(num), denominator(den) {
reduce();
}
// 拷贝构造函数
Fraction(const Fraction& other) : numerator(other.numerator), denominator(other.denominator) {}
// 判断是否为整数:分母为1时是整数
bool isInteger() const {
return denominator == 1;
}
// 加法运算
Fraction operator+(const Fraction& other) const {
i64 newDenominator = denominator * other.denominator;
i64 newNumerator = numerator * other.denominator + other.numerator * denominator;
return Fraction(newNumerator, newDenominator);
}
// 减法运算
Fraction operator-(const Fraction& other) const {
i64 newDenominator = denominator * other.denominator;
i64 newNumerator = numerator * other.denominator - other.numerator * denominator;
return Fraction(newNumerator, newDenominator);
}
// 乘法运算
Fraction operator*(const Fraction& other) const {
i64 newNumerator = numerator * other.numerator;
i64 newDenominator = denominator * other.denominator;
return Fraction(newNumerator, newDenominator);
}
// 除法运算
Fraction operator/(const Fraction& other) const {
if (other.numerator == 0) {
throw invalid_argument("除数不能为零");
}
i64 newNumerator = numerator * other.denominator;
i64 newDenominator = denominator * other.numerator;
return Fraction(newNumerator, newDenominator);
}
// 赋值运算符
Fraction& operator=(const Fraction& other) {
if (this != &other) {
numerator = other.numerator;
denominator = other.denominator;
}
return *this;
}
// 输出运算符重载(友元函数)
friend ostream& operator<<(ostream& os, const Fraction& f) {
if (f.denominator == 1) {
os << f.numerator;
} else {
os << f.numerator << " " << f.denominator;
}
return os;
}
// 获取分子
i64 getNumerator() const { return numerator; }
// 获取分母
i64 getDenominator() const { return denominator; }
};