Leetcode 166. Fraction to Recurring Decimal (Medium) (cpp)
Tag: Hash Table, Math
Difficulty: Medium
/*
166. Fraction to Recurring Decimal (Medium)
Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
If the fractional part is repeating, enclose the repeating part in parentheses.
For example,
Given numerator = 1, denominator = 2, return "0.5".
Given numerator = 2, denominator = 1, return "2".
Given numerator = 2, denominator = 3, return "0.(6)".
Hint:
No scary math, just apply elementary math knowledge. Still remember how to perform a long division?
Try a long division on 4/9, the repeating part is obvious. Now try 4/333. Do you see a pattern?
Be wary of edge cases! List out as many test cases as you can think of and test your code thoroughly.
*/
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if (!numerator) {
return "0";
}
string res;
if (numerator < 0 ^ denominator < 0) {
res += "-";
}
long n_l_abs = labs(long(numerator)), d_l_abs = labs(long(denominator));
res += to_string(n_l_abs / d_l_abs);
if (!(n_l_abs %= d_l_abs)) {
return res;
}
res += ".";
unordered_map<int, int> mapping;
int i = res.size() - 1;
while (n_l_abs) {
if (mapping.count(n_l_abs)) {
res.insert(mapping[n_l_abs], "(");
res += ")";
return res;
}
mapping[n_l_abs] = ++i;
res += to_string((n_l_abs *= 10) / d_l_abs);
n_l_abs %= d_l_abs;
}
return res;
}
};