算小数部分的难点在于如何判断是否是循环小数,以及找出循环节的位置。
回忆手工计算除法的过程,每次将余数乘10再除以除数,当同一个余数出现两次时,我们就找到了循环节。
循环节,就是第一次的余数位置,到第二次出现位置前面的数的,记录在res中,因此可以通过模拟的方法解决这个题目,注意边界比较多,要仔细处理
class Solution {
public:
string fractionToDecimal(int _numerator, int _denominator) {
long long numerator = _numerator, denominator = _denominator, ans;
int sign = 1;
if(numerator==0) return "0";
if(numerator<0&&denominator>0){
sign = -1;
numerator = -numerator;
}else if(numerator>0&&denominator<0){
sign = -1;
denominator = -denominator;
}
ans = numerator/denominator;
if(numerator%denominator==0) return to_string(sign*ans);
string res;
if(sign<0) res+= '-'+to_string(ans)+".";
else res+= to_string(ans)+".";
long long k = numerator%denominator;
unordered_map<long long, int> hashmap; // key num, 是在答案字符串中的位置
while(k){
if(hashmap.count(k)){
res= res.substr(0, hashmap[k]) + '(' + res.substr(hashmap[k]) + ')';
break;
}
else hashmap[k] = res.size();
long long tmp = k*10/denominator;
res+=to_string(tmp);
k = k*10%denominator;
}
return res;
}
};