给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
解题思路- 是否会有溢出
- 先计算整数部分,再计算小数部分
- 对于循环小数,确定循环位置
- 分子分母异号
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
long numeratorlong = numerator, denominatorlong = denominator;
// 整除
if(numeratorlong % denominatorlong == 0)
{
return to_string(numeratorlong / denominatorlong);
}
string res;
// 异号 通过异或来判断
if(numeratorlong < 0 ^ denominatorlong < 0)
{
res.push_back('-');
}
// 符号已经判断过,取正整数进行计算
numeratorlong = abs(numeratorlong);
denominatorlong = abs(denominatorlong);
res += to_string(numeratorlong / denominatorlong) + ".";
long rem = numeratorlong % denominatorlong;
unordered_map data;
int id = 0;
string fraction;
// 通过判断余数出现次数来判断循环位置,如果这个余数之前出现过,则进入循环
while(rem != 0 && !data.count(rem))
{
data[rem] = id;
rem *= 10;
fraction += to_string(rem / denominatorlong);
rem %= denominatorlong;
++id;
}
if(rem != 0)
{
int i = data[rem];
fraction = fraction.substr(0,i) + '(' + fraction.substr(i);
fraction.push_back(')');
}
res += fraction;
return res;
}
};



