// rational.h
#include <iostream>
class Rational {
public:
Rational() = default;
Rational(int numerator, int denominator);
~Rational() = default;
Rational operator+(Rational rhs); // 重载加
Rational operator-(Rational rhs); // 重载减
Rational operator*(Rational rhs); // 重载乘
Rational operator/(Rational rhs); // 重载除
bool operator>(Rational rhs); // 重载>
bool operator<(Rational rhs); // 重载<
void printRational(); // 打印有理数
int getNumerator() const {return numerator_; } // 访问分子 只读
int getDenominator() const {return denominator_; } // 访问分母 只读
private:
void simplifyRational(); // 有理数简化
int numerator_; // 分子
int denominator_; // 分母
};
// rational.cpp
#include "rational.h"
Rational::Rational(int numerator, int denominator) {
numerator_ = numerator;
denominator_ = denominator;
simplifyRational();
}
void Rational::simplifyRational() {
numerator_ = denominator_ >0 ? numerator_ : -numerator_;
denominator_ = denominator_ >0 ? denominator_ : -denominator_;
// 辗转相除法:除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数
int absNumerator = abs(numerator_);
int absDenominator = abs(denominator_);
while(absDenominator > 0) {
int tmp = absNumerator % absDenominator;
absNumerator = absDenominator;
absDenominator = tmp;
}
numerator_ /= absNumerator;
denominator_ /= absNumerator;
}
Rational Rational::operator+(Rational rhs) {
int ansNum = numerator_ * rhs.getDenominator() + denominator_ * rhs.getNumerator();
int ansDenom = denominator_ * rhs.getDenominator();
return Rational(ansNum, ansDenom);
}
Rational Rational::operator-(Rational rhs) {
int ansNum = numerator_ * rhs.getDenominator() - denominator_ * rhs.getNumerator();
int ansDenom = denominator_ * rhs.getDenominator();
return Rational(ansNum, ansDenom);
}
Rational Rational::operator*(Rational rhs) {
int ansNum = numerator_ * rhs.getNumerator();
int ansDenom = denominator_ * rhs.getDenominator();
return Rational(ansNum, ansDenom);
}
Rational Rational::operator/(Rational rhs) {
int ansNum = numerator_ * rhs.getDenominator();
int ansDenom = denominator_ * rhs.getNumerator();
return Rational(ansNum, ansDenom);
}
bool Rational::operator>(Rational rhs) {
int tmp = numerator_ * rhs.denominator_ - denominator_ * rhs.numerator_;
return tmp > 0;
}
bool Rational::operator<(Rational rhs) {
int tmp = numerator_ * rhs.denominator_ - denominator_ * rhs.numerator_;
return tmp < 0;
}
void Rational::printRational() {
if(numerator_ % denominator_ == 0) {
std::cout << numerator_ / denominator_;
}else {
std::cout << numerator_ << "/" << denominator_;
}
}
// test.cpp
#include "rational.h"
int main() {
Rational r1(6, 16);
Rational r2(20, 32);
Rational ans = r1 + r2;
r1.printRational();
std::cout << " + ";
r2.printRational();
std::cout << " = ";
ans.printRational();
std::cout << std::endl;
ans = r1 - r2;
r1.printRational();
std::cout << " - ";
r2.printRational();
std::cout << " = ";
ans.printRational();
std::cout << std::endl;
ans = r1 * r2;
r1.printRational();
std::cout << " * ";
r2.printRational();
std::cout << " = ";
ans.printRational();
std::cout << std::endl;
ans = r1 / r2;
r1.printRational();
std::cout << " / ";
r2.printRational();
std::cout << " = ";
ans.printRational();
std::cout << std::endl;
if(r1 > r2) {
r1.printRational();
std::cout << " > ";
r2.printRational();
std::cout << std::endl;
}else {
r1.printRational();
std::cout << " < ";
r2.printRational();
std::cout << std::endl;
}
if(r1 < r2) {
r1.printRational();
std::cout << " < ";
r2.printRational();
std::cout << std::endl;
}else {
r1.printRational();
std::cout << " > ";
r2.printRational();
std::cout << std::endl;
}
}
编译并运行测试:
g++ test.cpp rational.cpp -o rational
./rational
测试结果如下: