题目名称
给定一个表示分数加减运算的字符串 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 = (x1y2-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; }
|