LeetCode 166 Javascript 解法

133 阅读1分钟

思路

这道题靠找循环

肯定会有循环

比较复杂的有 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);
}