class Solution(object):
def fractionAddition(self, expression):
def gcd(a, b):
a = abs(a)
b = abs(b)
if a == 0 or b == 0:
return 1
if b > a:
a, b = b, a
c = a % b
while c != 0:
a = b
b = c
c = a % b
return b
if expression == "":
return "0/1"
ops = []
if expression[0] != '-':
ops = ['+']
data = [[0,1]]
preData = 1
i = 0
size = len(expression)
while i < size:
ch = expression[i]
datum1 = 0
while ch.isdigit():
datum1 = datum1 * 10 + ord(ch) - ord('0')
i += 1
if i < size:
ch = expression[i]
else:
break
if datum1 != 0:
if ops == []:
data.append([datum1, 1])
else:
op = ops[-1]
if op == '/':
del ops[-1]
datum = data[-1]
del data[-1]
div = gcd(datum[0], datum1)
data.append([int(datum[0] / div), int(datum1 / div * datum[1])])
else:
data.append([datum1, 1])
if not ch.isdigit():
ops.append(ch)
i += 1
data1 = data[0]
for i in range(1, len(data)):
op = ops[i - 1]
data2 = data[i]
div = gcd(data1[1], data2[1])
gcd1 = data1[1] * data2[1] / div
if op == '+':
datum = data1[0] * gcd1 / data1[1] + data2[0] * gcd1 / data2[1]
else:
datum = data1[0] * gcd1 / data1[1] - data2[0] * gcd1 / data2[1]
div = gcd(gcd1, datum)
data1 = [int(datum / div), int(gcd1 / div)]
if data1[0] == 0:
return "0/1"
return "%d"%data1[0] + "/" + "%d"%data1[1]
算法分析与设计第十八周:592. Fraction Addition and Subtraction
最新推荐文章于 2022-09-29 23:07:45 发布