166. 分数到小数

这题真的挺难的,主要难在数学,哈希表的使用倒是很浅显,我也是看了别人的思路再自己写的。
a/b,a为被除数、b为除数
思路就是把所有补0的被除数都放入哈希表,对应的键值是当前字符串的长度。若出现相同的补过0的被除数则代表接下来除法的结果会开始循环,则跳出循环并在对应位置加括号输出。
几个要判断的地方:
1.假如当前被除数小于除数,加了一位或补了一个0之后还是小于除数,则在结果中应该加0,如1/100=0.01,1/1000=0.001,但若是首位的话,不加0,如100/11=9.0(90),第一位1<11,1加上后面一位变成10后还是小于11,但这里不加0,因为结果字符串还是空的,即要判断一下字符串是否为空。
2.加小数点的时机,是在被除数第一次补0的时候,并且如果加了小数点后字符串首位就是小数点,那在前面还要补个0,如1/10这样的情况,不补0结果就变成.1了。
3.退出循环后,判断下被除数cur是否为空。若为空说明除尽了,直接输出,否则按照题意要在循环开始处和末尾加括号后再输出。

class Solution:
    def fractionToDecimal(self, numerator: int, denominator: int) -> str:
        if denominator==0:
            return 'inf'
        m,n=str(abs(numerator)),abs(denominator)
        i,siz=1,len(m)
        res=''
        dic={}
        cur=int(m[:i])
        dot=0
        while i<siz or (cur and cur not in dic) :
            # print(res,cur)
            if cur<n:
                #被除数cur加上后面一位或者补0
                if i<siz:
                    #未到最后一位,就用cur加上后面一位
                    cur=cur*10+int(m[i])
                    i+=1
                else:
                    cur=cur*10
                    dot+=1   #更新dot指示变量
                    if dot==1:  #第一次补0,加上小数点'.'
                        res+='.'
                        if res[0]=='.':
                            res='0'+res
                if cur<n and len(res):  #首位不补0,中间补0
                    res+='0'
            else:
                if dot>=1:  #补0的被除数加入字典
                    dic[cur]=len(res)
                #做除法
                res+=str(cur//n)    #整数部分加入结果
                cur=cur%n
        if cur:
            l=dic[cur]
            res=res[:l]+'('+res[l:]+')'
        if numerator>0 and denominator<0 or numerator<0 and denominator>0 :
            res='-'+res
        if not res:
            res='0'
        return res
posted @ 2019-08-03 22:13  NeoZy  阅读(125)  评论(0编辑  收藏  举报