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 |