LeetCode-166-分数到小数

在这里插入图片描述

1、哈希表

我们可以利用哈希表来判断我们在进行除法的时候是否出现相同的余数,若出现相同的余数则肯定会出现循环小数。

我们首先对特殊情况进行处理,对被除数为0的情况进行讨论,而后我们计算添加结果的符号。接着我们向最终结果中添加其整数部分,并通过判断是否整除来确定是否需要添加小数点,而后我们开始添加小数部分。在计算小数部分时,我们单独记录小数部分的字符串,并利用哈希表来记录每一个余数与对应的位置,值得注意的是,我们每次都将余数乘以十之后进行计算,从而确保我们每次都只添加一位。最终我们通过判断是否出现相同的余数和被除数是否为0来确定是否需要跳出循环。最终我们只需要根据我们在哈希表中记录的相应位置,向结果中添加循环小数部分与括号即可。

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        long numerator_long = abs(numerator), denominator_long = abs(denominator);
        string res;
        unordered_map<long, int> hs;
        if (numerator == 0) {
            return to_string(0);
        }
        if ((numerator > 0) ^ (denominator > 0)) {
            res.push_back('-');
        }
        long quotient = numerator_long / denominator_long;
        long remainder = numerator_long % denominator_long;
        res += to_string(quotient);
        if (remainder == 0) {
            return res;
        }
        res.push_back('.');

        string fractionPart;
        int index = 0;
        while (remainder != 0 && !hs.count(remainder)) {
            hs[remainder] = index;
            remainder *= 10;
            fractionPart += to_string(remainder / denominator_long);
            remainder %= denominator_long;
            index++;
        }
        if (remainder != 0) {
            int insertIndex = hs[remainder];
            fractionPart = fractionPart.substr(0, insertIndex) + '(' + fractionPart.substr(insertIndex);
            fractionPart.push_back(')');
        }
        res += fractionPart;

        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值