题解
【提高】求多个分数的和
1 条题解
-
0
解题思路
题目要求计算多个分数的和,结果用最简分数表示。
思路:逐个通分累加。
- 先读入第一个分数 a1/b1
- 循环读入加号和下一个分数 a2/b2,把结果通分:
- 新分子 = a1×b2 + a2×b1
- 新分母 = b1×b2
- 重复累加所有分数
- 最后约分:分子分母同除以最大公约数
- 如果结果是整数(分母约分后为 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