总结一下:
很多边界问题,有些难处理。
- 处理负数
- 处理INT_MIN溢出
- 无限循环的起始位置
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
long long N = numerator;
long long D = denominator;
if(N == 0) return "0";
bool flag = false;
if(N < 0){flag = !flag;N = -N;}
if(D <0){flag = !flag;D = -D;}
long long R = N%D; // 余数
long long Q = N/D; // 商
string ans = (flag?"-":"") + to_string(Q) ;
if(R == 0) return ans;
ans += ".";
map<long long,int> mp;
int loc = 0;
queue<long long> q;
N = R;
while(N != 0){
if(mp[N] != 0){
//此时已经循环
int ta = 1;
int tb = mp[N];
while(!q.empty()){
if(ta == tb) ans += '(';
ta++;
ans += (q.front() + '0');
q.pop();
}
ans += ')';
return ans;
}
mp[N] = ++loc;
N *= 10;
while(N < D){
mp[N] = ++loc;
N *= 10;
q.push(0);
}
R = N%D;
Q = N/D;
q.push(Q);
N = R;
}
while(!q.empty()){
ans += (q.front() + '0');
q.pop();
}
return ans;
}
};