【PAT B-1034】有理数四则运算

【PAT B-1034】有理数四则运算

C++代码

#include <bits/stdc++.h>
using namespace std;
using gg = long long;
gg gcd(gg a, gg b) { return b == 0 ? a : gcd(b, a % b); }
using F = array<gg, 2>;
F input() {
    F f;
    char c;  //吸收'/'符号
    cin >> f[0] >> c >> f[1];
    return f;
}
void simplify(array<gg, 2>& f) {
    if (f[0] == 0) {
        f[1] = 1;
        return;
    }
    if (f[1] < 0) {
        f[1] = -f[1];
        f[0] = -f[0];
    }
    gg d = gcd(abs(f[0]), abs(f[1]));
    f[0] /= d;
    f[1] /= d;
}
F Plus(const F& f1, const F& f2) {
    F f;
    f[0] = f1[0] * f2[1] + f2[0] * f1[1];
    f[1] = f1[1] * f2[1];
    simplify(f);
    return f;
}
F Sub(const F& f1, const F& f2) {
    F f;
    f[0] = f1[0] * f2[1] - f2[0] * f1[1];
    f[1] = f1[1] * f2[1];
    simplify(f);
    return f;
}
F Multiply(const F& f1, const F& f2) {
    F f;
    f[0] = f1[0] * f2[0];
    f[1] = f1[1] * f2[1];
    simplify(f);
    return f;
}
F Div(const F& f1, const F& f2) {
    F f;
    f[0] = f1[0] * f2[1];
    f[1] = f1[1] * f2[0];
    simplify(f);
    return f;
}
void output(const F& f) {
    if (f[0] < 0)
        cout << '(';
    if (f[1] == 1) {
        cout << f[0];
    } else if (abs(f[0]) < f[1]) {
        cout << f[0] << "/" << f[1];
    } else
        cout << f[0] / f[1] << " " << abs(f[0]) % f[1] << "/" << f[1];
    if (f[0] < 0)
        cout << ')';
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    auto f1 = input(), f2 = input();
    simplify(f1);
    simplify(f2);
    unordered_map<char, function<F(F, F)>> um = {
        {'+', Plus}, {'-', Sub}, {'*', Multiply}, {'/', Div}};
    for (char c : {'+', '-', '*', '/'}) {
        output(f1);
        cout << ' ' << c << ' ';
        output(f2);
        cout << " = ";
        if (c == '/' and f2[0] == 0) {
            cout << "Inf\n";
        } else {
            auto f3 = um[c](f1, f2);
            output(f3);
            cout << '\n';
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我真的不是cjc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值