思路
Python中的//运算取整除:向下取接近商的整数,负数 // 正数 的最小值为1。而 %取模运算返回整除的余数 (余数 = 被除数 - 除数 * 商)。注意这两点就可以较容易解出。
# python
class Solution:
def toHex(self, num: int) -> str:
CONV = "0123456789abcdef"
ans = []
# 32位2进制数,转换成16进制 -> 4个一组,一共八组
for _ in range(8):
# 当输入值num为-1 ,第一次进入循环
ans.append(num % 16) # num % 16 = 15
num //= 16 # num // 16 = -1
# Python中的//运算取整除:向下取接近商的整数
# %取模运算返回整除的余数 (余数 = 被除数 - 除数 * 商)
# 负数 // 正数 的最小值为1
# -1 // 16 = 1
# -1 % 16 = 15
# 即如num为负数,则一定会跑满for的8次循环
# 正数 // 正数 的最小值为0
# 1 // 16 = 0
# 1 % 16 = 1
# 即num为正数时,有可能触发下面的if语句,提前结束for循环
if not num: # 如果num不为0则继续下一次for循环
break # 如果num为0则终止for循环
# 正数 // 负数 的最小值为-1,如1 // -16 = -1; 1 % -16 = -15
return "".join(CONV[n] for n in ans[::-1])
思路
用字典存储出现过的余数。计算小数部分时,每次将余数乘以 10,然后计算小数的下一位数字,并得到新的余数。重复上述操作直到余数变成 0 或者找到在字典里出现过的余数。
# python3
class Solution:
def fractionToDecimal(self, numerator: int, denominator: int) -> str:
if numerator * denominator < 0:
flag = '-'
else:
flag = ''
a = abs(numerator)
b = abs(denominator)
c, d = divmod(a, b)
if not d:
return flag + str(c)
dic = dict()
res = list()
res.append(str(c))
res.append('.')
i = 2
dic[d] = i
while d:
d *= 10
c, d = divmod(d, b)
res.append(str(c))
i = i + 1
if d not in dic:
dic[d] = i
else:
res.insert(dic[d], '(')
res.append(')')
return flag + ''.join(res)
return flag + ''.join(res)