1、哈希表
我们可以利用哈希表来判断我们在进行除法的时候是否出现相同的余数,若出现相同的余数则肯定会出现循环小数。
我们首先对特殊情况进行处理,对被除数为0的情况进行讨论,而后我们计算添加结果的符号。接着我们向最终结果中添加其整数部分,并通过判断是否整除来确定是否需要添加小数点,而后我们开始添加小数部分。在计算小数部分时,我们单独记录小数部分的字符串,并利用哈希表来记录每一个余数与对应的位置,值得注意的是,我们每次都将余数乘以十之后进行计算,从而确保我们每次都只添加一位。最终我们通过判断是否出现相同的余数和被除数是否为0来确定是否需要跳出循环。最终我们只需要根据我们在哈希表中记录的相应位置,向结果中添加循环小数部分与括号即可。
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
long numerator_long = abs(numerator), denominator_long = abs(denominator);
string res;
unordered_map<long, int> hs;
if (numerator == 0) {
return to_string(0);
}
if ((numerator > 0) ^ (denominator > 0)) {
res.push_back('-');
}
long quotient = numerator_long / denominator_long;
long remainder = numerator_long % denominator_long;
res += to_string(quotient);
if (remainder == 0) {
return res;
}
res.push_back('.');
string fractionPart;
int index = 0;
while (remainder != 0 && !hs.count(remainder)) {
hs[remainder] = index;
remainder *= 10;
fractionPart += to_string(remainder / denominator_long);
remainder %= denominator_long;
index++;
}
if (remainder != 0) {
int insertIndex = hs[remainder];
fractionPart = fractionPart.substr(0, insertIndex) + '(' + fractionPart.substr(insertIndex);
fractionPart.push_back(')');
}
res += fractionPart;
return res;
}
};