leetcode-每日一题2021.10.3 分数到小数

题目

力扣

思路

竖式法,分为整数,有限小数和无限循环小数三种情况。如果得到的是整数,直接用to_string返回。是小数的情况就先确定正负号,如果两个数同号就取正号,如果两个数异号就取负号。然后再加上整数部分和小数点。如果是无限循环小数的情况,可以用余数相同来判断是否有循环,用unordered_map存储小数后面的余数,如果余数相同就加上左右两边的括号,并且退出循环。

代码

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        if((int64_t)numerator%denominator==0)
            return to_string((int64_t)numerator/denominator);
        int64_t up=abs((int64_t)numerator),down=abs((int64_t)denominator);
        string ans(((numerator<0)^(denominator<0)?"-":"")+to_string(up/down)+".");
        unordered_map<int64_t,int> index;

        for(int i=ans.size();up=up%down*10;i++){
            if(index.count(up)){
                ans.insert(ans.begin()+index[up],'(');
                ans.push_back(')');
                break;
            }
            index[up]=i;
            ans.push_back('0'+up/down);
        }
        return ans;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值