166. Fraction to Recurring Decim

2021-10-05  本文已影响0人  jluemmmm

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。如果存在多个答案,只需返回 任意一个 。

长除法

/**
 * @param {number} numerator
 * @param {number} denominator
 * @return {string}
 */
var fractionToDecimal = function(numerator, denominator) {
  if (numerator % denominator === 0) {
    return Math.floor(numerator / denominator) + '';
  }
  // 符号
  const res = [];
  if (numerator < 0 ^ denominator < 0) { 
    res.push('-');
  }
  // 整数部分
  numerator = Math.abs(numerator);
  denominator = Math.abs(denominator);
  res.push(Math.floor(numerator / denominator) + '.');
  
  // 小数部分
  const frac = [];
  const map = new Map();
 
  let remainder = numerator % denominator;
  let index = 0;
  while (remainder !== 0 && !map.has(remainder)) {
    map.set(remainder, index);
    remainder *= 10;
    frac.push(Math.floor(remainder / denominator));
    remainder %= denominator;
    index++;
  }
  if (remainder !== 0) { // 有循环节
    let insertIndex = map.get(remainder);
    frac.splice(insertIndex, 0, '(');
    frac.push(')');
  }
  res.push(frac.join(''));
  return res.join('');
};

上一篇下一篇

猜你喜欢

热点阅读