class Solution:
def fractionToDecimal(self, numerator: int, denominator: int) -> str:
if numerator == 0:
return "0"
res = ""
#同号为正,异号位负,用异或实现
res += '-' if (numerator > 0) ^ (denominator > 0) else ''
num = abs(numerator)
den = abs(denominator)
#整数部分
res += str(num // den)
num %= den
if num == 0:
return res
#小数部分
res += '.'
#将小数循环节存入map中
#num作为键,值为当前串的长度
hashMap = {}
#初始化
hashMap[num] = len(res)
#就像竖式除法一样,每次*10(添0)再除
while num != 0:
num *= 10
res += str(num // den)
num %= den
#若遇到出现过的被除数,即出现循环节
if num in hashMap:
#查map得到循环节出现的第一个位置,插入括号
idx = hashMap[num]
res = res[:idx] + '(' + res[idx:]
res += ')'
break
else: #否则记录map
hashMap[num] = len(res)
return res