题目:
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fraction-to-recurring-decimal
思路:
其实这题不难,记得高中好像做过,就是要考虑的细节非常多:
比如正负数、是否被零除、是否有小数、是否为循环小数等
代码是先判断结果是正负数,然后求结果的整数位,若无余数直接返回结果,若有余数则加上小数点,再求小数位
小数位的求法:找规律就会发现如果已经出现过的余数再次出现,即可以判断该段为小数的循环部分,那么终止并加括号,因此只需要对余数进行哈希。
代码如下:
#!/usr/bin/env python3.6
# _*_coding:utf-8 _*_
# @Time : 2019/10/31 11:56
# @Author : Grey
class Solution:
def fractionToDecimal(self, numerator: int, denominator: int) -> str:
if numerator == 0 or denominator == 0:
return "0"
ans = ""
if numerator * denominator < 0:
ans = ans + "-"
numerator = abs(numerator)
denominator = abs(denominator)
ans = ans + str(numerator // denominator)
r = numerator % denominator
if r == 0:
return ans
ans = ans + "."
dic = {}
position = 1
temp = ""
while r > 0:
if r not in dic.keys():
dic[r] = position
r = r * 10
temp = temp + str(r // denominator)
r = r % denominator
position = position + 1
else:
temp = temp[0:dic[r]-1] + "(" + temp[dic[r]-1:] + ")"
break
ans = ans + temp
return ans
if __name__ == "__main__":
n, m = 52, 9
print(Solution.fractionToDecimal("self", n, m))