注意事項:
- 減法運算中 ,爲了避免分母前出現負號的情況,在處理時,將所有負數按其絕對值處理。最後再添負號
- 除法運算中,0 / 0輸出結果是 Inf。邏輯判斷時 0 / 0容易出現bug
- 在判斷正負的時候,別用兩個數乘積來判斷。因爲如果這兩個數過大容易出現結果溢出情況
# coding:utf-8
def Num(s):
N, k, F = 0, 0, 0
if s[0] == '-':
F = 1
s[1:] = s[-1: 0: -1]
s = s[1:]
else:
s[0:] = s[-1:: -1]
for item in s:
N += int(item) * 10 ** k
k += 1
if F == 0:
return N
else:
return (N * -1)
def GCD(a, b):
if a < b:
a, b = b, a
while b != 0:
a, b = b, a % b
return a
def Rationalized(m_a, d_a): # 有理化
flag = 0 #flag 爲0表示 分子,分母同號
if (m_a < 0 and d_a > 0) or (m_a > 0 and d_a < 0):
flag = 1
if m_a < 0 and d_a > 0:
m_a = m_a * (-1)
if m_a > 0 and d_a < 0:
d_a = d_a * (-1)
if d_a == 0:
return ('Inf')
elif m_a == 0:
return ('0') # 如果返回 (0), 在len()中 (0) 會被當作 int而報錯
else:
num = int(m_a / d_a)
remainder = abs(m_a) % abs(d_a)
gcd = GCD(remainder, d_a)
m = int(remainder / gcd)
d = int(d_a / gcd)
if num == 0 and m != 0:
st = (("%d/%d") % (m, d))
elif num == 0 and m == 0:
st = ('0')
elif num != 0 and m == 0:
st = ("%d" % num)
else:
st = ("%d %d/%d" % (num, m, d))
if flag == 1:
st = (('(-') + st + (')'))
return st
s1, s2 = input().split()
Mol_1, Den_1 = s1.split('/')
Mol_2, Den_2 = s2.split('/')
Mol_1 = list(Mol_1)
Den_1 = list(Den_1)
Mol_2 = list(Mol_2)
Den_2 = list(Den_2)
mol_1 = Num(Mol_1)
den_1 = Num(Den_1)
mol_2 = Num(Mol_2)
den_2 = Num(Den_2)
# 操作數與被操作數的有理化
num_1 = Rationalized(mol_1, den_1)
num_2 = Rationalized(mol_2, den_2)
#加
m_a = mol_1 * den_2 + mol_2 * den_1
d_a = den_1 * den_2
num_a = Rationalized(m_a, d_a)
# 打印加法結果
print(num_1 + ' + ' + num_2 + ' = ' + num_a)
# 減
m_a = mol_1 * den_2 - mol_2 * den_1
d_a = den_1 * den_2
num_a = Rationalized(m_a, d_a)
print(num_1 + ' - ' + num_2 + ' = ' + num_a)
# 乘
m_a = mol_1 * mol_2
d_a = den_1 * den_2
num_a = Rationalized(m_a, d_a)
print(num_1 + ' * ' + num_2 + ' = ' + num_a)
# 除
m_a = mol_1 * den_2
d_a = den_1 * mol_2
num_a = Rationalized(m_a, d_a)
print(num_1 + ' / ' + num_2 + ' = ' + num_a)