题目名称

给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果。

这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。

示例

输入: expression = “-1/2+1/2”
输出: “0/1”

输入: expression = “-1/2+1/2+1/3”
输出: “1/3”

输入: expression = “1/3-1/2”
输出: “-1/6”

题解

死办法,把分子分母单独提取出来,进行数值运行,最后提取出公约数后,将分子分母简化到最简

分数的加减法则

x1/y1 + x2/y2 = (x1y2+x2y1)/y1y2
x1/y1 - x2/y2 = (x1
y2-x2y1)/y1y2

最大公约数

用a和b求余,如果余数为0,则最大公约数为b,否则用 b 与 a%b 的进行求余比较,最后当余数为0时,剩余的数则是这两个数的最大公约数

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
var fractionAddition = function(expression) {
let denominator = 0, numerator = 1; // 分子,分母
let index = 0, n = expression.length;
while (index < n) {
// 读取分子
let denominator1 = 0, sign = 1;
if (expression[index] === '-' || expression[index] === '+') {
sign = expression[index] === '-' ? -1 : 1;
index++;
}
while (index < n && isDigit(expression[index])) {
denominator1 = denominator1 * 10 + expression[index].charCodeAt() - '0'.charCodeAt();
index++;
}
denominator1 = sign * denominator1;
index++;

// 读取分母
let numerator1 = 0;
while (index < n && isDigit(expression[index])) {
numerator1 = numerator1 * 10 + expression[index].charCodeAt() - '0'.charCodeAt();
index++;
}

denominator = denominator * numerator1 + denominator1 * numerator;
numerator *= numerator1;
}
if (denominator === 0) {
return "0/1";
}
const g = gcd(Math.abs(denominator), numerator); // 获取最大公约数
return Math.floor(denominator / g) + "/" + Math.floor(numerator / g);
}

const gcd = (a, b) => {
let remainder = a % b;
while (remainder !== 0) {
a = b;
b = remainder;
remainder = a % b;
}
return b;
};

const isDigit = (ch) => {
return parseFloat(ch).toString() === "NaN" ? false : true;
}