166.分数到小数 (Medium)*
题目描述*

标签*
数学;哈希表;
思路 & 代码*
跟 两数相除 差不多,主要难度在于判断循环,找到循环节,商循环意味着余数的循环。
class Solution {
public:
string fractionToDecimal(int n, int d) {
if(d == 0) {
return "";
}
if(n == 0) {
return "0";
}
string res = "";
auto num = static_cast<long long>(n);
auto denom = static_cast<long long>(d);
if((num > 0) ^ (d > 0)) {
res.push_back('-');
}
num = llabs(num), denom = llabs(denom);
// 整数部分
res.append(to_string(num / denom));
// 小数
num %= denom;
if(num == 0) {
return res;
}
res.push_back('.');
int idx = res.length() - 1;
// 判断循环余数
unordered_map<int, int> record;
while(num && !record.count(num)) {
record[num] = ++idx;
num *= 10;
res.append(to_string(num / denom));
num %= denom;
}
if(record.count(num)) {
res.insert(record[num], "(");
res.push_back(')');
}
return res;
}
};
最后更新: July 23, 2022