top1编程
← 返回题目
题解

【提高】求多个分数的和

1 条题解

  • 0
    @ 2026-7-31 15:23:07

    解题思路

    题目要求计算多个分数的和,结果用最简分数表示。

    思路:逐个通分累加。

    1. 先读入第一个分数 a1/b1
    2. 循环读入加号和下一个分数 a2/b2,把结果通分:
      • 新分子 = a1×b2 + a2×b1
      • 新分母 = b1×b2
    3. 重复累加所有分数
    4. 最后约分:分子分母同除以最大公约数
    5. 如果结果是整数(分母约分后为 1),直接输出整数

    为什么要通分? 分母不同的分数不能直接相加,要先把分母变成一样的(取两个分母的乘积),分子相应调整。

    举例:1/12+5/12+1/3

    • 1/12+5/12 = 6/12
    • 6/12 + 1/3:通分 = 6×3+1×12 / 36 = 30/36
    • 约分:30/36 = 5/6

    参考代码

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int gcd(int a, int b) {
        if (a % b == 0) return b;
        return gcd(b, a % b);
    }
    
    int main() {
        int a1, b1, a2, b2;
        char c;
    
        scanf("%d/%d", &a1, &b1);  // 第一个分数
    
        while (scanf("%c%d/%d", &c, &a2, &b2) == 3) {
            a1 = a1 * b2 + a2 * b1;  // 通分累加
            b1 = b1 * b2;
        }
    
        int m = gcd(a1, b1);  // 约分
        a1 /= m;
        b1 /= m;
    
        if (b1 == 1) {
            cout << a1;  // 整数
        } else {
            cout << a1 << '/' << b1;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N log M),N 个分数,每次求 gcd
    • 空间复杂度:O(1)
    • 1