题目: 给定两个整数,分别表示分数的分子 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))