目录
题目
- 给定两个整数,分别表示分数的分子 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)# 将结果列表转换为字符串并返回
标签:分数,res,denominator,numerator,字符串,余数,166,小数
From: https://www.cnblogs.com/lushuang55/p/18036719