跳转至

166. 分数到小数#

问题描述#

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数

如果小数部分为循环小数,则将循环的部分括在括号内。

如果存在多个答案,只需返回 任意一个

对于所有给定的输入,保证 答案字符串的长度小于 104

 

示例 1:


输入:numerator = 1, denominator = 2
输出:"0.5"

示例 2:


输入:numerator = 2, denominator = 1
输出:"2"

示例 3:


输入:numerator = 2, denominator = 3
输出:"0.(6)"

示例 4:


输入:numerator = 4, denominator = 333
输出:"0.(012)"

示例 5:


输入:numerator = 1, denominator = 5
输出:"0.2"

 

提示:

  • -231 <= numerator, denominator <= 231 - 1
  • denominator != 0

解题思路#

模拟除法竖式计算过程。

注意的几个点有:

  1. 可能为负数的情况
  2. 用字典保存每次的分子位置,从而判断是否出现循环

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution:
    def fractionToDecimal(self, numerator: int, denominator: int) -> str:
        ans = []
        if numerator * denominator < 0:  # 结果为负数
            ans.append("-")

        numerator, denominator = abs(numerator), abs(denominator)  # 转为正数计算

        a, numerator = divmod(numerator, denominator)  # 得到整数部分
        ans.append(str(a))

        if numerator:
            ans.append(".")
            i, d = len(ans) - 1, {}
            while numerator:  # 除尽
                i += 1
                d[numerator] = i

                numerator *= 10
                while numerator < denominator:  # 不够除补 0
                    numerator *= 10
                    ans.append("0")
                    i += 1

                a, numerator = divmod(numerator, denominator)
                ans.append(str(a))

                if numerator in d:  # 出现循环
                    ans.append(")")
                    ans[d[numerator] : d[numerator]] = ["("]
                    break

        return "".join(ans)
返回顶部

在手机上阅读