美文网首页
分数到小数

分数到小数

作者: 王王王王王景 | 来源:发表于2019-08-05 21:20 被阅读0次

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

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

示例 1:

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

示例 2:

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

示例 3:

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

代码:

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        long _num = numerator == INT_MIN ? 0x80000000 : abs(numerator);
        long _den = denominator == INT_MIN ? 0x80000000 : abs(denominator);
        // 先计算整数部分
        long zs = _num / _den;
        if(zs < 0) zs *= -1;
        _num = _num % _den;
        // 判断是否为正数
        bool is_pos = ((numerator ^ denominator) >= 0 ? true : false);
        vector<long> re; // 用于记录小数部分
        // 用来存放被使用的被除数,用于判断是否存在循环小数,对应的是在re中的下标
        unordered_map<long, int> _map; 
        int crc_index = -1; // 记录循环小数的起始下标
        while(_num != 0) {
            while(_num < _den) {
                _num *= 10;
                if(_num < _den)
                    re.push_back(0);
            }
            if(_map.find(_num) != _map.end()) {
                // 存在循环小数
                crc_index = _map[_num];
                break;
            } else {
                re.push_back(_num / _den);
                _map[_num] = re.size() - 1;
                _num %= _den;
            }
        }
        string re_str= to_string(zs);
        if(re.size() > 0) re_str += ".";
        for(int i = 0; i < re.size(); ++i) {
            if(i == crc_index) {
                re_str += "(";
            }
            re_str += to_string(re[i]);
        }
        if(crc_index != -1) re_str += ")"; // 有循环小数
        if(!is_pos && numerator != 0) re_str = "-" + re_str; // 负数情况
        return re_str;
    }
};

相关文章

网友评论

      本文标题:分数到小数

      本文链接:https://www.haomeiwen.com/subject/sgvvdctx.html