166. 分数到小数(中)

题目

  • 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
    如果小数部分为循环小数,则将循环的部分括在括号内。
    如果存在多个答案,只需返回 任意一个 。
    对于所有给定的输入,保证 答案字符串的长度小于 104 。

示例 1:

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

示例 2:

输入:numerator = 2, denominator = 1
输出:"2"

示例 3:

输入:numerator = 4, denominator = 333
输出:"0.(012)"

题解

class Solution:
    def fractionToDecimal(self, numerator: int, denominator: int) -> str:
        # s=''
        a=numerator/denominator
        s="%s" % a#把浮点型a转换成字符串s
        #rstrip是一个字符串方法,用于移除字符串末尾的指定字符。
        s=s.rstrip("0").rstrip(".") if "." in s else s#处理比如2.0移除末尾0和小数点
        return s 
        #如果字符串中出现了循环,把循环的部分用括号括起来
        i=s.find(".")+1
        j=i+1
        while j< len(s):
            if j!=i:
                j+=1
            else:
                i+=1
                j+=1
        s = s.split(".")[0] + "."  + "(" + decimal_part[i:j] + ")"  # 构建带括号的循环部分
        return s 
  • 循环小数的情况没有解决

正解

class Solution:
    def fractionToDecimal(self, numerator: int, denominator: int) -> str:
        if numerator == 0: return "0"#如果分子为0,直接返回"0"
        res = [] # 结果列表,用于存储转换后的字符串
        # 首先判断结果正负, 异或作用就是 两个数不同 为 True 即 1 ^ 0 = 1 或者 0 ^ 1 = 1
        if (numerator > 0) ^ (denominator > 0):
            res.append("-")
        numerator, denominator = abs(numerator), abs(denominator)# 取绝对值,符号是单独处理的
        # 判断到底有没有小数
        #divmod(a, b) 返回一个元组 (a // b, a % b),其中a // b表示a除以b的整数部(商),a % b 表示 a 除以b 的余数。
        a, b = divmod(numerator, denominator)#eg:10/3,a=3,b=1
        res.append(str(a))# 将整数部分转换为字符串并添加到结果列表中,res=3
        # 无小数
        if b == 0:# 如果余数为0,说明结果为整数,直接返回结果
            return "".join(res)
        res.append(".")# 添加小数点,res=3.
        # 处理余数
        # 把所有出现过的余数记录下来
        loc = {b: len(res)} # 用字典记录余数出现的位置。1:2
        while b:
            b *= 10  #将余数扩大10倍,用于计算下一位小数b=1*10=10
            a, b = divmod(b, denominator) #计算当前位的商和余数a=3,b=1
            res.append(str(a)) #将当前位的商转换为字符串并添加到结果列表res=3.3
            # 余数前面出现过,说明开始循环了,加括号
            if b in loc:#现在的b=1,出现在loc中
                res.insert(loc[b], "(")#插入左括号,res=3.(3
                res.append(")")#末尾加反括号res=3.(3)
                break
            # 在把该位置的记录下来
            loc[b] = len(res)# 记录当前余数的位置
        return "".join(res)# 将结果列表转换为字符串并返回
posted @ 2024-02-27 21:08  Frommoon  阅读(4)  评论(0编辑  收藏  举报