So, the best solution I have seen. 点击打开链接
Integer part is easy to handle. For the fraction part, we need to remember where the loop start. Thus, we need to remember the position to insert '(' and the remainder.
#include <string>
#include <unordered_map>
#include <iostream>
using namespace std;
string getDec(long remainder, long den) {
string res = "";
unordered_map<long, int> map;
int i = 0;
while((remainder != 0) && (map.find(remainder) == map.end())) {
map.insert(make_pair(remainder, i));
i++;
remainder = remainder * 10;
res = res + (to_string(remainder/den));
remainder = remainder % den;
}
if(remainder != 0) {
int pos = map[remainder];
res.insert(pos, 1, '('); // insert position, bytes, char
res = res + ")";
}
return res;
}
string fractionToDecimal(int numerator, int demoinator) {
long num = numerator;
long den = demoinator;
bool neg = num * den < 0;
num = abs(num);
den = abs(den);
string res = neg ? ("-" + to_string(num / den)) : to_string(num / den);
long remainder = num % den;
return (remainder == 0) ? res : (res + "." + getDec(remainder, den));
}
int main(void) {
cout << fractionToDecimal(4, 333) << endl;
}