166. Fraction to Recurring Decimal

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.

Example 1:

Input: numerator = 1, denominator = 2
Output: "0.5"

Example 2:

Input: numerator = 2, denominator = 1
Output: "2"

Example 3:

Input: numerator = 2, denominator = 3
Output: "0.(6)"
string fractionToDecimal(int numerator, int denominator) {
    if (numerator == 0) return "0";
    long long num = abs((long long)numerator);
    long long den = abs((long long)denominator);
    long long out = num / den;
    long long rem = num % den;
    unordered_map<long long, int> mp;
    string res = ((numerator > 0) ^ (denominator > 0)) ? "-" : "";
    res += to_string(out);
    if (rem == 0) return res;
    res += ".";
    string s;
    int pos = 0;
    while (rem != 0) {
        if (mp.count(rem)) {
            s.insert(mp[rem], "(");
            s += ")";
            return res + s;
        }
        mp[rem] = pos;
        s += to_string((rem * 10) / den);
        rem = (rem * 10) % den;
        ++pos;
    }
    return res + s;
}
string fractionToDecimal(int numerator, int denominator) {
    if (numerator == 0) return "0";
    string res = ((numerator > 0) ^ (denominator > 0)) ? "-" : "";
    long long num = abs((long long)numerator);
    long long den = abs((long long)denominator);
    // integral
    res += to_string(num / den);
    num %= den;
    if (num == 0) return res;
    // fractional
    res += ".";
    unordered_map<long long, int> mp;
    mp[num] = res.length();
    while (num) {
        num *= 10;
        res += to_string(num / den);
        num %= den;
        if (mp.count(num)) {
            int pos = mp[num];
            res.insert(pos, "(");
            res += ")";
            break;
        } else {
            mp[num] = res.length();
        }
    }
    return res;
}

Last updated

Was this helpful?