void populateAfterDecimal(long num,long den,string &res){
// key : remainder
// value : position in res where the remainder occured for the first time
unordered_map<long, long> m;
string ans = "";
while(num){
// if num is not found in the map
if(m.find(num) == m.end()){
m[num] = res.size()-1;
long q = num/den;
long r = num%den;
res+= to_string(q);
num = r*10;
} else {
ans = res.substr(0,m[num]+1) + "(" + res.substr(m[num]+1,res.size()-m[num]) + ")";
res = ans;
break;
}
}
}
string fractionToDecimal(long numerator, long denominator) {
if(numerator == 0) return "0";
string res = "";
// negative result
if(numerator < 0 && denominator >0 || numerator > 0 && denominator < 0)
res+="-";
long num = abs(numerator);
long den = abs(denominator);
// before the decimal
long q = num/den;
long rem = num%den;
res+=to_string(q);
// decimal
if(rem == 0)
return res;
res += ".";
// after the decimal processing
populateAfterDecimal(rem*10,den,res);
return res;
}