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; }