解题思路
先处理负号,注意-INT_MAX转正会爆int;全转long long
然后用除法得到小数点前的部分,之后模拟除法不断更新余数作为新的被除数;
如果被除数再次出现,就是循环的断点;该数第一次出现的位置到当前末尾就是循环的部分;
代码
class Solution {
public:
string fractionToDecimal(int numer, int deno) {
if(numer == deno) return "1";
if(numer == 0) return "0";
string ans = "", s = "";
long long numerator = (long long)numer, denominator = (long long)deno;
if(numerator < 0 && denominator < 0) { //去负号
numerator *= -1; denominator *= -1;
}
else if(numerator > 0 && denominator < 0) {
ans += '-'; denominator *= -1;
}
else if(numerator < 0 && denominator > 0) {
ans += '-'; numerator *= -1;
}
if(numerator < denominator) ans += "0.";
else {
if(numerator % denominator == 0) return ans + to_string(numerator / denominator);
ans += to_string(numerator / denominator);
ans += '.';
numerator %= denominator;
}
int cnt = 1e4, pos = 0, break_point = 0;
unordered_map<int, int> num;
while(cnt--) {
if(num.count(numerator)) {
break_point = num[numerator];
break;
}
else num[numerator] = pos;
pos++;
numerator *= 10;
if(numerator % denominator == 0) {
s += numerator / denominator + '0';
return ans + s;
}
else if(numerator / denominator == 0) {
s += '0';
}
else {
s += numerator / denominator + '0';
numerator %= denominator;
}
}
string left = s.substr(0, break_point);
string right = s.substr(break_point);
return ans + left + '(' + right + ')';
}
};