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