top1编程
← 返回题目
题解

【提高】分数计算

1 条题解

  • 0
    @ 2026-7-31 15:17:27

    解题思路

    题目要求计算两个分数的加减法,结果用最简分数表示。

    思路:

    1. 解析:把表达式拆成第一个分数、运算符、第二个分数,再解析每个分数的分子和分母
    2. 通分:分母取 b1×b2,分子 = a1×b2 ± a2×b1
    3. 约分:分子分母同除以它们的最大公约数
    4. 处理特殊情况:
      • 结果为 0,直接输出 0
      • 结果是负数,先输出负号
      • 结果能整除(分母为 1),直接输出整数

    为什么用字符串解析? 输入是一个整体表达式,没有空格,需要用 find 找运算符,用 substr 切出每个分数,再切分子分母。

    怎么判断加还是减? 先找加号,找不到就是减号。

    举例:1/12+5/12

    • 通分:分子 = 1×12+5×12 = 72,分母 = 144
    • 约分:72/144 = 1/2

    参考代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    int gcd(int a, int b) {
        while (b) {
            int t = a % b;
            a = b;
            b = t;
        }
        return a;
    }
    
    int main() {
        string s;
        cin >> s;
    
        int p = s.find('+');
        if (p == -1) p = s.find('-');
    
        string s1 = s.substr(0, p);
        string s2 = s.substr(p + 1);
        char op = s[p];
    
        int a1 = stoi(s1.substr(0, s1.find('/')));
        int b1 = stoi(s1.substr(s1.find('/') + 1));
        int a2 = stoi(s2.substr(0, s2.find('/')));
        int b2 = stoi(s2.substr(s2.find('/') + 1));
    
        int fm = b1 * b2;
        int fz = (op == '+') ? a1 * b2 + a2 * b1 : a1 * b2 - a2 * b1;
    
        if (fz == 0) {
            cout << 0;
            return 0;
        }
        if (fz < 0) {
            cout << "-";
            fz = -fz;
        }
    
        int g = gcd(fz, fm);
        fz /= g;
        fm /= g;
    
        if (fm == 1) {
            cout << fz;
        } else {
            cout << fz << "/" << fm;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(log N),求最大公约数
    • 空间复杂度:O(1)
    • 1