跳转至

166.分数到小数 (Medium)*

题目描述*

标签*

数学;哈希表;

思路 & 代码*

两数相除 差不多,主要难度在于判断循环,找到循环节,商循环意味着余数的循环。

class Solution {
public:
    string fractionToDecimal(int n, int d) {
        if(d == 0) {
            return "";
        }
        if(n == 0) {
            return "0";
        }
        string res = "";
        auto num = static_cast<long long>(n);
        auto denom = static_cast<long long>(d);
        if((num > 0) ^ (d > 0)) {
            res.push_back('-');
        }
        num = llabs(num), denom = llabs(denom);
        // 整数部分
        res.append(to_string(num / denom));
        // 小数
        num %= denom;
        if(num == 0) {
            return res;
        }
        res.push_back('.');
        int idx = res.length() - 1;
        // 判断循环余数
        unordered_map<int, int> record;

        while(num && !record.count(num)) {
            record[num] = ++idx;
            num *= 10;
            res.append(to_string(num / denom));
            num %= denom;
        }

        if(record.count(num)) {
            res.insert(record[num], "(");
            res.push_back(')');
        }
        return res;
    }
};

最后更新: July 23, 2022