166. 分数到小数

题目:
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fraction-to-recurring-decimal

思路:
其实这题不难,记得高中好像做过,就是要考虑的细节非常多:
比如正负数、是否被零除、是否有小数、是否为循环小数等

代码是先判断结果是正负数,然后求结果的整数位,若无余数直接返回结果,若有余数则加上小数点,再求小数位
小数位的求法:找规律就会发现如果已经出现过的余数再次出现,即可以判断该段为小数的循环部分,那么终止并加括号,因此只需要对余数进行哈希。
代码如下:

#!/usr/bin/env python3.6
# _*_coding:utf-8 _*_
# @Time   : 2019/10/31 11:56
# @Author : Grey


class Solution:
    def fractionToDecimal(self, numerator: int, denominator: int) -> str:
        if numerator == 0 or denominator == 0:
            return "0"
        ans = ""
        if numerator * denominator < 0:
            ans = ans + "-"
        numerator = abs(numerator)
        denominator = abs(denominator)
        ans = ans + str(numerator // denominator)
        r = numerator % denominator

        if r == 0:
            return ans
        ans = ans + "."
        dic = {}
        position = 1
        temp = ""
        while r > 0:
            if r not in dic.keys():
                dic[r] = position
                r = r * 10
                temp = temp + str(r // denominator)
                r = r % denominator
                position = position + 1
            else:
                temp = temp[0:dic[r]-1] + "(" + temp[dic[r]-1:] + ")"
                break
        ans = ans + temp
        return ans

if __name__ == "__main__":
    n, m = 52, 9
    print(Solution.fractionToDecimal("self", n, m))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值