036-力扣刷题-166--分数到小数

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

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

示例 1:

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

输入: numerator = 2, denominator = 1 输出: "2" 示例 3:

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

 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
34
35
36
37
38
39
40
41
42
43
44
class Solution(object):
    def fractionToDecimal(self, numerator, denominator):
        """
        :type numerator: int
        :type denominator: int
        :rtype: str
        """
        #这里一个注意的是是list[0:5] #取前五个但是取不到索引为5的元素
        #negativeflag 除法的标志位,为了使用绝对值的方便
        negativeFlag = numerator*denominator < 0 #如果说其中有一个是负的那么相乘是小于零的返回的就是True否则返回的就是False

        numerator=abs(numerator)  #求绝对值
        denominator=abs(denominator)
        numlist=[] #存储除法计算的商的每一位,如果是循环会多存储一位
        cnt = 0  #记录存储的次数,算是一个循环检测开始的标志位
        loopDict={} #用来存储的是不重复的数字,从小数开始存储
        loopStr=None  #循环的小数字符


        while True:
            numlist.append(str(numerator//denominator))   #s首先存储的是整数位,注意的是这里直接存储的是字符串
            cnt+=1 #count=1的是手存储的是第一位小数
            numerator = (numerator%denominator)*10  #模仿的是除法的手动计算的方法,将除完的余数乘上10继续对分母做除法(手动计算是补零)
            if numerator == 0: #如果最后除完了没有循环那么就直接停止while循环
                break
            loc=loopDict.get(numerator)  #判断一下现在的余数乘上10是不是在字典中,如果在的话说明再除以分母就开始循环了
            if loc:
                loopStr="".join(numlist[loc:cnt]) #如果loc有返回值说明已经开始循环了,循环的原因是只要余数的十倍开始相同,因为分母是相同的那么就会一直循环下去.这里cnt正好是numlist的长度,所以loc取出的是循环开始的数再numlist中的索引位置.
                break
            loopDict[numerator]=cnt  #如果字典里没有那么就直接将这个余数的十倍跟此时的count作为键值进行存储

        #循环完成开始输出
        ans = numlist[0]#先存储的是整数值字符串
        if len(numlist) > 1:  #说明有小数,那么需要添加小数点
            ans+="."
        #如果说有循环数字的话那么进行添加
        if loopStr:
            ans+="".join(numlist[1:len(numlist)-len(loopStr)])+"("+loopStr+")"
            numlist=[2 8 6 3] #循环的是6 3 非循环的是小数是8
        else:
            ans+="".join(numlist[1:]) #否则的话就将整除完的数进行添加
        if negativeFlag:
            ans="-"+ans
        return ans

image.png