思路
这道题靠找循环
肯定会有循环
比较复杂的有 1/17
也有循环
商和余数都一样,那肯定是循环开始了
代码
/**
* @param {number} numerator
* @param {number} denominator
* @return {string}
*/
var fractionToDecimal = function(numerator, denominator) {
let quotientOuter = numerator / denominator
let counter = [numerator, denominator].reduce((ac, el) => {
if (el < 0)
ac++
return ac
}, 0)
let res = 1
if (counter % 2 === 1) {
res = -1
}
if (Number.isInteger(quotientOuter)) {
return `${res * Math.abs(quotientOuter)}`
}
quotientOuter = floor(quotientOuter)
let remainder = numerator - quotientOuter * denominator
const pairs = []
while (true) {
remainder *= 10
let quotient = remainder / denominator
if (Number.isInteger(quotient)) {
return `${quotientOuter === 0 && res < 0 ? '-' + quotientOuter : quotientOuter}.${pairs.map(renderNum).join('')}${Math.abs(quotient)}`
}
quotient = floor(quotient)
remainder = remainder - quotient * denominator
const pair = `${quotient}~~~${remainder}`
const index = pairs.indexOf(pair)
if (index >= 0) { // 有循环了
pairs.splice(index, 0, '(~~~?')
return `${quotientOuter === 0 && res < 0 ? '-' + quotientOuter : quotientOuter}.${pairs.map(renderNum).join('')})`
}
pairs.push(pair)
}
}
function renderNum(el) {
const num = el.split('~~~')[0]
if (isNaN(num)) return num
return Math.abs(Number.parseInt(num))
}
function floor(num) {
if (num >= 0)
return Math.floor(num)
return Math.ceil(num)
}