分别用成员函数和友元函数重载运算符,使对整型的运算符=、+、-、*、/适用于分数运算。要求:(1)输出结果是最简分数(可以是带分数);(2)分母为1,只输出分子。
2条回答 默认 最新
- _GX_ 2021-12-14 06:02关注
// g++ -Wall -std=c++17 main.cpp #include <iostream> #include <numeric> class RationalNumber { public: typedef int value_type; constexpr RationalNumber(value_type a, value_type b) : _a(a), _b(b) { simplify(); } constexpr RationalNumber &operator=(const RationalNumber &other) { _a = other._a; _b = other._b; return *this; } constexpr RationalNumber &operator+=(const RationalNumber &other) { auto a = _a * other._b + other._a * _b; auto b = _b * other._b; _a = a; _b = b; simplify(); return *this; } constexpr RationalNumber &operator-=(const RationalNumber &other) { auto a = _a * other._b - other._a * _b; auto b = _b * other._b; _a = a; _b = b; simplify(); return *this; } constexpr RationalNumber &operator*=(const RationalNumber &other) { _a *= other._a; _b *= other._b; simplify(); return *this; } constexpr RationalNumber &operator/=(const RationalNumber &other) { _a *= other._b; _b *= other._a; simplify(); return *this; } constexpr void simplify() { auto c = std::gcd(_a, _b); if (c != 0) { _a /= c; _b /= c; } } private: value_type _a; value_type _b; friend constexpr RationalNumber operator+(const RationalNumber &lhs, const RationalNumber &rhs); friend constexpr RationalNumber operator-(const RationalNumber &lhs, const RationalNumber &rhs); friend constexpr RationalNumber operator*(const RationalNumber &lhs, const RationalNumber &rhs); friend constexpr RationalNumber operator/(const RationalNumber &lhs, const RationalNumber &rhs); template <typename CharT, typename Traits> friend std::basic_ostream<CharT, Traits> &operator<<(std::basic_ostream<CharT, Traits> &os, const RationalNumber &number); }; constexpr RationalNumber operator+(const RationalNumber &lhs, const RationalNumber &rhs) { RationalNumber tmp = lhs; tmp += rhs; return tmp; } constexpr RationalNumber operator-(const RationalNumber &lhs, const RationalNumber &rhs) { RationalNumber tmp = lhs; tmp -= rhs; return tmp; } constexpr RationalNumber operator*(const RationalNumber &lhs, const RationalNumber &rhs) { RationalNumber tmp = lhs; tmp *= rhs; return tmp; } constexpr RationalNumber operator/(const RationalNumber &lhs, const RationalNumber &rhs) { RationalNumber tmp = lhs; tmp /= rhs; return tmp; } template <typename CharT, typename Traits> std::basic_ostream<CharT, Traits> &operator<<(std::basic_ostream<CharT, Traits> &os, const RationalNumber &r) { if (r._b == 0) { os << "INF"; } else if (r._b == 1) { os << r._a; } else { auto c = r._a / r._b; if (c == 0) { os << r._a << '/' << r._b; } else { auto a = r._a % r._b; os << c << '+' << a << '/' << r._b; } } return os; } int main() { char ch; int a1, b1, a2, b2; std::cout << "Input Fraction 1 (Format: a/b): "; std::cin >> a1 >> ch >> b1; std::cout << "Input Fraction 2 (Format: a/b): "; std::cin >> a2 >> ch >> b2; RationalNumber r1(a1, b1); RationalNumber r2(a2, b2); std::cout << r1 << " + " << r2 << " = " << r1 + r2 << '\n'; std::cout << r1 << " - " << r2 << " = " << r1 - r2 << '\n'; std::cout << r1 << " * " << r2 << " = " << r1 * r2 << '\n'; std::cout << r1 << " / " << r2 << " = " << r1 / r2 << '\n'; return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
- ¥15 活动选择题。最多可以参加几个项目?
- ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
- ¥15 vs2019中数据导出问题
- ¥20 云服务Linux系统TCP-MSS值修改?
- ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
- ¥20 怎么在stm32门禁成品上增加查询记录功能
- ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
- ¥50 NT4.0系统 STOP:0X0000007B
- ¥15 想问一下stata17中这段代码哪里有问题呀