166. Fraction to Recurring Decimal

题目

Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.

If the fractional part is repeating, enclose the repeating part in parentheses.

For example,

  • Given numerator = 1, denominator = 2, return "0.5".
  • Given numerator = 2, denominator = 1, return "2".
  • Given numerator = 2, denominator = 3, return "0.(6)".
分析

计算整数除法,要求循环的小数位用括号括起来,最初打算保存小数,并利用int [10]的数组保存每个值出现的位置,有重复则说明循环,加入括号即可,但是发现有些情况,比如1/333,会出现0.003003的循环,因此小数的循环不是根据商的重复出现而定,而是余数的重复出现决定的,参考0ms C++ Solution with Detailed Explanations 的思想进行修改,利用map保存<余数,下标>,当余数重复出现时,只需在上次出现位置之前插入左括号,在当前末尾加入右括号即可。

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        long num=numerator, den=denominator;
        string res;
        if(!num)
            return "0";
        if(num<0^den<0)//如果num和den其中一个为负数,则需要在结果前面加上负号
            res+="-";
        num=num<0?num*=-1:num;//将负值转换成正数
        den=den<0?den*=-1:den;
        long inter=num/den;//保存整数部分
        res+=to_string(inter);//结果加入整数部分
        num=num%den;//根据余数计算小数部分的除法
        if(!num)//余数为0则整除,直接返回
            return res;
        res+=".";//否则加入小数点并余数*10进行借位除法
        num*=10;
        unordered_map<long,long> map;//用map保存小数除法中的被除数,循环的条件是出现重复的被除数而不是通过重复的商判断
        while(num){
            long temp=num/den;
            if(map.find(num)!=map.end()){//如果出现了重复的被除数,则下一步一定会循环,所以在上次被除数出现的位置之前插入左括号(,并在末尾插入右括号)
                res.insert(map[num],1,'(');
                res+=")";
                return res;
            }
            map[num]=res.size();//被除数不重复时,令map保存当前被除数的商在res中的下标位置,由于res还未压入商,故该下标位置为res.size()
            res+=to_string(temp);
            num%=den;//取余数,乘10,继续除法运算
            num*=10;
        }
        return res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值