166. 分数到小数

要求:模拟分子除以分母
思路:有理数包括整数和分数,分数为有限小数或者无限循环。出现无限循环可以看余数
在这里插入图片描述

class Solution {
    using ll = long long;
public:
    string fractionToDecimal(int numerator, int denominator) {
        ll n = numerator, d = denominator;
        string ret;
        // 计算整数部分,化成正数
        if(n * d < 0) ret += "-";
        ll a = n / d;
        if(a < 0) a *= -1;
        ret += to_string(a);
        if(n < 0) n*= -1;
        if(d < 0) d*= -1;
        // 拿余数计算小数部分
        n %= d;
        if(n == 0)
            return ret;
        ret += ".";
        // 哈希表记录是否有第二次出现
        unordered_map<int, int> st;
        string t;
        int index = 0;
        //一次循环是一次除法
        while(n && !st.count(n)) {
            st[n] = index++;//当前余数的位置,一开始不一定是循环
            n *= 10;
            t.push_back((char)(n / d + '0'));//t存小数部分,包括不在循环内的
            n %= d;
        }
        if(n != 0) {
            // 说明出现了循环,此时对循环部分 [st[n], index] 加括号
            ret += t.substr(0, st[n]) + "(" + t.substr(st[n]) + ")";
        } else {
            ret += t;
        }
        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值