592. 分数加减运算(中)
题目
-
给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果。
这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。
示例 1:
输入: expression = "-1/2+1/2"
输出: "0/1"
示例 2:
输入: expression = "-1/2+1/2+1/3"
输出: "1/3"
示例 3:
输入: expression = "1/3-1/2"
输出: "-1/6"
题解:模拟
class Solution:
def fractionAddition(self, expression: str) -> str:
# 返回结果也需要是分数 只能进行分数运算
i = 0
n1, d1 = 0, 1
while i<len(expression):
# 读取符号
i, sign = self.read_sign(i, expression)
# 读取分子
i, n2 = self.read_number(i, expression)
# 跳过‘/‘
i+=1
# 读取分母
i, d2 = self.read_number(i, expression)
# 计算 n1/d1 和 n2/d2 的结果; 要同时赋值
d1, n1 = d1*d2, n1*d2+sign*d1*n2
# 如果结果为零 分母=1, 否则约分
if n1==0:
d1=1
else:
divisor = gcd(n1, d1)
n1 = n1//divisor
d1 = d1//divisor
return str(n1)+'/'+str(d1)
def read_sign(self, i, expression):# 读取符号
sign = -1 if expression[i]=='-' else 1
if expression[i]=='-' or expression[i]=='+':
i+=1#读完符号后移动指针
return i, sign
def read_number(self, i, expression):# 读取分子/分母
num = 0
while i<len(expression) and expression[i].isdigit():
num = num*10+int(expression[i])#读取的数有可能超过一位数
i += 1
return i, num
def gcd(self, a, b):
"""辗转相除法找a和b的公因数"""
while a%b:
a, b = b, a%b
return b