LeetCode每日一题|166. 分数到小数

329 阅读1分钟
  • 题目描述

题目链接:leetcode-cn.com/problems/fr… image.png

  • 思路分析

输出结果分为三个部分,符号、整数、小数。

符号部分只需要判断两个数中有几个负数,只有其中一个为负数另不为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}`;
};