Description
Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
If the fractional part is repeating, enclose the repeating part in parentheses.
Example 1:
Input: numerator = 1, denominator = 2
Output: "0.5"
Example 2:
Input: numerator = 2, denominator = 1
Output: "2"
Example 3:
Input: numerator = 2, denominator = 3
Output: "0.(6)"
分析
题目的意思是:给你被除数和除数,然后两数相除。
- 这道题的关键是判断小数的无限循环,这里用了一个hash表来存放分子除法的每一个余数,如果出现余数一样了,说明存在循环了,我们把循环部分插入一个括号就行了。这道题我感觉还是蛮难的,毕竟既要考虑溢出,正负号,又要考虑循环。
cpp
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if(numerator==0) return "0";
string result="";
if(numerator<=0^denominator<=0) result+="-";
long long num=abs((long long)numerator);
long long den=abs((long long)denominator);
result+=to_string(num/den);
num=num%den;
if(num==0){
return result;
}else{
result+=".";
}
unordered_map<int,int> map;
while(num){
if(map.find(num)!=map.end()){
result.insert(map[num],1,'(');
result+=')';
break;
}
map[num]=result.size();
num=num*10;
result+=to_string(num/den);
num=num%den;
}
return result;
}
};
python
下面是python版本,要考虑正负号和无限循环(需要map)
class Solution:
def fractionToDecimal(self, numerator: int, denominator: int) -> str:
if numerator == 0:
return "0"
res = []
if (numerator<0) ^ (denominator<0):
res.append('-')
numerator = abs(numerator)
denominator = abs(denominator)
res.append(str(numerator//denominator))
remain = numerator % denominator
if remain ==0:
return "".join(res)
res.append(".")
d_map = {}
while remain != 0:
if remain in d_map:
idx = d_map[remain]
res.insert(idx,'(')
res.append(')')
break
d_map[remain]=len(res)
remain = remain * 10
res.append(str(remain//denominator))
remain = remain%denominator
return "".join(res)
本文详细解析了一种算法,用于将任意两个整数表示的分数转换为字符串格式的循环小数。通过使用哈希表跟踪余数,能够准确识别并标记小数部分的循环模式,适用于正数和负数的输入。

3万+

被折叠的 条评论
为什么被折叠?



