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

示例 2:

示例 3:

示例 4:

示例 5:

2.思路
小数部分如果余数重复出现两次就表示该小数是循环小数。
- 转换为long long防止溢出
- 处理正负号,一正一负取负号
- 分子分母全部转换为正数
- 获得小数点的下标,把’('插入小数点前面
- map用来记录出现重复数的下标,然后将’('插入到重复数前面
- 出现循环余数,我们直接在重复数字前面添加’(’,字符串末尾添加’)’
3.代码
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if(numerator == 0){
return "0";
}
if(denominator == 0){
return "";
}
string res = "";
//转换为long long防止溢出
long long nume = static_cast<long long>(numerator);
long long denom = static_cast<long long>(denominator);
//处理正负号,异号为负
if((nume > 0) ^ (denom > 0)){
res.push_back('-');
}
//转化为正数
nume = llabs(nume);
denom = llabs(denom);
//整数部分
res.append(to_string(nume / denom));
//小数部分
nume %= denom; //获得余数
if(nume == 0){
return res; //余数为0直接返回
}
res.push_back('.');
int index = res.size() - 1; // 小数点下标
unordered_map<int, int> record;//记录余数重复的下标,将“(”插入重复数的前面
while(nume && record.count(nume) == 0){
record[nume] = ++index;
nume *= 10;
res += to_string(nume / denom);
nume %= denom;
}
if(record.count(nume) == 1){
res.insert(record[nume], "(");
res.push_back(')');
}
return res;
}
};
1万+

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



