力扣每日一题2021-10-03分数到小数


166.分数到小数

题目描述

分数到小数


思路:高精度除法

每一位小数是通过*10再除余计算的。而循环小数可以通过判断被除数有没有出现过,出现的位置在哪来判断(哈希记录)。
高精度除法

class Solution:
    def fractionToDecimal(self, numerator: int, denominator: int) -> str:
        def hdiv(dividend, divisor, precision=0):
            if (dividend > 0 and divisor > 0) or (dividend < 0 and divisor < 0):
                flag = 1
            else:
                flag = -1
            dividend = abs(dividend)
            divisor = abs(divisor)
            quotient = dividend // divisor
            remainder = dividend % divisor
            if remainder == 0:
                return str(quotient * flag)
            ans = [str(quotient), '.']
            repeats = dict()
            i = 0
            while i < precision:
                dividend = remainder * 10
                quotient = dividend // divisor
                remainder = dividend % divisor
                if dividend in repeats:
                    ans.insert(repeats[dividend], '(')
                    ans.append(')')
                    break
                ans.append(str(quotient))
                repeats[dividend] = i + 2
                if remainder == 0:
                    break
                i += 1
            if precision == 0:
                ans.pop(1)
            if flag == -1:
                return '-' + ''.join(ans)
            return ''.join(ans)
        return hdiv(numerator, denominator, 10000)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值