小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
166. 分数到小数
题目描述
给定两个整数,分别表示分数的分子
numerator和分母denominator,以 字符串形式返回小数 。如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
示例 1:
输入:numerator = 1, denominator = 2
输出:"0.5"
示例 2:
输入:numerator = 4, denominator = 333
输出:"0.(012)"
思路:除法模拟+Map
- 模拟除法,是否除尽
- 不能整除,整数小数分开处理
- 通过一个
Map,记录每次余数和序号 - 若余数为0,则拼接整数部分+小数部分,返回结果
- 遇到哈希表中已有的余数时,在已有余数的索引前插入(末尾插入)即可。
var fractionToDecimal = function(numerator, denominator) {
let rem = Math.abs(numerator) % Math.abs(denominator);
let divide = numerator/denominator;
let sign = true;
if (divide < 0){
sign = false;
divide = -divide;
}
let int = Math.floor(divide);
if (rem == 0) {
if (sign) return `${int}`;
return `-${int}`
};
let float = [];
let remMap = new Map();
let index = 1;
while (rem != 0) {
if (!remMap.has(rem)){
remMap.set(rem, index);
} else {
float.splice(remMap.get(rem) - 1, 0, '(')
float.splice(index, 0 ,')');
return sign ? int + '.' + float.join('') : '-' + int + '.' + float.join('');
}
rem *= 10;
index++;
if (rem < denominator){
float.push(0);
continue;
}
float.push(Math.floor(rem/Math.abs(denominator)));
rem = rem % Math.abs(denominator)
}
return sign ? int + '.' + float.join('') : '-' + int + '.' + float.join('')
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤