leetcode 每日一题 2021/10/3 166. 分数到小数

leetcode每日一题之分数到小数

##难度:中等

解题思路:

​ 除法计算过程:

​ 依次除,余数小于除数乘以10。

整数之间的除法有三种结果:

​ (1)整数
​ (2)有限小数
​ (3)无限不循环小数

需要解决的问题:

​ (1)判断得到结果的正负
​ a^b<0 说明a和b异号 解释:a、b异号则其中一个高位为1、另一个高位为0,异或运算结果必然小于0。
​ (2)判断什么时候结束运算
​ 1)余数为0: a%b==0;
​ 2)找到循环小数的循环体: a%b等于曾经出现过的余数,如果一个余数出现了第二次,除数不变,结果必然一直循环。

代码:

```cpp
	class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        long long a = numerator; //防止数据溢出
        long long b = denominator;
       if(a % b == 0){
           return to_string(a/b);
       }
       string s = ((numerator^denominator))<0? "-"+to_string(abs(numerator/denominator)):to_string((numerator/denominator));//判断是否异号
       s.push_back('.');
       long long divisor = abs(numerator % denominator);
       denominator = abs(denominator);
       map<long long,int> remainder;
       for(int i = s.length();divisor = (divisor % denominator) *10//divisor=0时代表有限小数终止循环;i++){
           if(remainder[divisor]){ //该余数曾经出现过,加上括号终止循环。
               s.insert(s.begin()+remainder[divisor], '(');
               s.push_back(')');
               break;
           }
           remainder[divisor] = i;
           s.append(to_string(divisor/denominator));
       }
        return s;
    }
};

其他:
to_string()将number转成string
-2^32/(-1)后溢出int范围
string::push_back()压入字符
string::append()压入字符串


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值