题目

July 10, 2021 · View on GitHub

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。

如果小数部分为循环小数,则将循环的部分括在括号内。

如果存在多个答案,只需返回 任意一个 。

对于所有给定的输入,保证 答案字符串的长度小于 104 。

示例 1:

输入:numerator = 1, denominator = 2
输出:"0.5"

示例 2:

输入:numerator = 2, denominator = 1
输出:"2"

示例 3:

输入:numerator = 2, denominator = 3
输出:"0.(6)"

示例 4:

输入:numerator = 4, denominator = 333
输出:"0.(012)"

示例 5:

输入:numerator = 1, denominator = 5
输出:"0.2"

  提示:

  • -231 <= numerator, denominator <= 231 - 1
  • denominator != 0

参考答案

class Solution {
public:
    using LL = long long;
    string fractionToDecimal(int numerator , int denominator) {
        if (numerator == 0) return "0";
        string rs;
        unordered_map<int, int> us;
        vector<int> vi;
        bool f1 = numerator < 0, f2 = denominator < 0;
        LL num = abs(numerator), den = abs(denominator);
        // 小数点前
        LL q = num / den;
        rs += to_string(num / den);

        // 小数点后
        LL r = num % den * 10;
        string str;
        while (r != 0 && us.find(r) == us.end()) {
            vi.push_back(r);
            us[r] = vi.size() - 1;
            q = r / den;
            str = str + to_string(q);
            r = (LL)((r % den) * 10);
        }
        // 判断小数点后是否存在循环
        if (r == 0) {
            if (str != "") rs += "." + str;
        } else {
            // 如果有循环,从第几位开始循环
            auto it = us.find(r);
            int i = it->second;
            rs += "." + str.substr(0, i) + "("  + str.substr(i, vi.size() - i) + ")";
        }

        // 符号不同,添加 负号
        if (f1 != f2) {
            rs = "-" + rs;
        }
        return rs;
    }
};