-
题目描述
题目链接:leetcode-cn.com/problems/fr…
-
思路分析
输出结果分为三个部分,符号、整数、小数。
符号部分只需要判断两个数中有几个负数,只有其中一个为负数另不为0时才在答案前添加负号;整数部分则只需要取两数相除结果的向下取整就可以。
小数部分,计算每一位小数的方式是余数乘10后再除除数并取余,为了判断小数是否是循环小数,所以要判断该余数是否重复,若是重复则表示出现了循环,因此需要记录每一个余数是否出现,以及出现的位置,不循环小数则会因为余数归零从而退出循环。所以在计算结束后可以根据余数是否为零来判断是否出现了循环,再将括号加在循环体的位置也就是之前该余数上次出现的位置。
最后将几个部分组合起来返回即可。
-
代码
var fractionToDecimal = function (numerator, denominator) {
let res = '';
let isPositive = true;
if(numerator < 0) {
numerator = -numerator;
isPositive = !isPositive;
}
if(denominator < 0) {
denominator = -denominator;
isPositive = !isPositive;
}
if(numerator==0) {
isPositive = true;
}
let mimus = isPositive ? '' : '-';
let remainder = numerator % denominator * 10;
let mmap = new Map();
for (let i = 0; remainder && !mmap.has(remainder); i++) {
mmap.set(remainder, i);
res += `${Math.floor(remainder / denominator)}`;
remainder %= denominator;
remainder *= 10;
}
if (remainder) {
res = `.${res.slice(0,mmap.get(remainder))}(${res.slice(mmap.get(remainder))})`
} else if (res.length) {
res = '.' + res;
}
return `${mimus}${Math.floor(numerator / denominator)}${res}`;
};