LeetCode之Fraction to Recurring Decimal

本文介绍了一种将任意分数转换为十进制小数的方法,重点在于如何处理循环小数,并通过使用哈希表来记录计算过程中的余数及其位置,确保能够正确标识循环节。文章详细解释了算法实现步骤,包括整数部分与小数部分的计算逻辑。
摘要由CSDN通过智能技术生成
/*思路:
1.计算整数部分;这里主要注意,分子绝对值小于分母绝对值且分子分母异号时,要返回“-0”。
2.计算小数部分;思路:用一个hash表记住出现过的余数以及余数对应的位置,如果当前用于计算
  小数的余数在hash表中存在,则应返回结果,注意添加循环小数的括号。
3.合并整数、小数部分,返回结果。
整体来说,思路相对简单,但是写代码时有很多细节需要注意。*/
class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        string s0 = interger(numerator, denominator);
        string s1 = decimal(numerator, denominator);
        if(s1.empty()) return s0;
        else return s0 + "." + s1;
    }
    
    string interger(long long numerator, long long denominator){//计算整数部分
        string res;
        long long num = numerator / denominator;
        stringstream s;
        s << num;
        s >> res;
        if(res == "0" && numerator * denominator < 0) res.insert(0, "-");
        return res;
    }
    
    string decimal(int numerator, int denominator){//计算小数部分
        long long n = numerator, d = denominator;
        if(n < 0) n = -n;
        if(d < 0) d = -d;
        if(n >= d) n %= d;
        unordered_map<int, int> appeared;
        string res;
        int count(0);
        while(n != 0){
            if(appeared.find(n) != appeared.end()){//余数出现过
                res.insert(appeared[n], "(");
                res += ")";
                return res;
            }
            else{//余数未出现过
                appeared[n] = count;
                n *= 10; 
                int tmp = n/d;
                n %= d;
                res += ('0' + tmp);
            } 
            ++count;
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值