题解
【提高】分数计算
1 条题解
-
0
解题思路
题目要求计算两个分数的加减法,结果用最简分数表示。
思路:
- 解析:把表达式拆成第一个分数、运算符、第二个分数,再解析每个分数的分子和分母
- 通分:分母取 b1×b2,分子 = a1×b2 ± a2×b1
- 约分:分子分母同除以它们的最大公约数
- 处理特殊情况:
- 结果为 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