Leetcode 166 分数到小数 模拟竖式除法

算小数部分的难点在于如何判断是否是循环小数,以及找出循环节的位置。
回忆手工计算除法的过程,每次将余数乘10再除以除数,当同一个余数出现两次时,我们就找到了循环节。

循环节,就是第一次的余数位置,到第二次出现位置前面的数的,记录在res中,因此可以通过模拟的方法解决这个题目,注意边界比较多,要仔细处理
 

class Solution {
public:
    string fractionToDecimal(int _numerator, int _denominator) {
        long long numerator = _numerator, denominator = _denominator, ans;
        int sign = 1;
        if(numerator==0) return "0";
        if(numerator<0&&denominator>0){
            sign = -1;
            numerator = -numerator;
        }else if(numerator>0&&denominator<0){
            sign = -1;
            denominator = -denominator;
        }
        ans = numerator/denominator;
        if(numerator%denominator==0) return to_string(sign*ans);
        string res;
        if(sign<0) res+= '-'+to_string(ans)+".";
        else res+= to_string(ans)+".";
        long long k = numerator%denominator;
        unordered_map<long long, int> hashmap;     // key num, 是在答案字符串中的位置
        while(k){
            if(hashmap.count(k)){
                res= res.substr(0, hashmap[k]) + '(' + res.substr(hashmap[k]) + ')';
                break;
            }
            else hashmap[k] = res.size();        
            long long tmp = k*10/denominator;
            res+=to_string(tmp);
            k = k*10%denominator;
        }
        return res;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值