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()压入字符串