给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
思路:模拟除法,借助哈希表来判断是否出现循环
代码如下:
public String fractionToDecimal(int numerator, int denominator) { long numeratorLong = numerator; long denominatorLong = denominator; if (numeratorLong % denominatorLong == 0){ return String.valueOf(numeratorLong / denominatorLong); } StringBuffer sb = new StringBuffer(); if (numeratorLong < 0 ^ denominatorLong < 0){ sb.append('-'); } //整数部分 numeratorLong = Math.abs(numeratorLong); denominatorLong = Math.abs(denominatorLong); long integerPart = numeratorLong / denominatorLong; sb.append(integerPart); sb.append('.'); //小数部分 StringBuffer fractionPart = new StringBuffer(); HashMap<Long, Integer> map = new HashMap<>(); long remainder = numeratorLong % denominatorLong; int index = 0; while (remainder != 0 && !map.containsKey(remainder)){ map.put(remainder, index); remainder = remainder * 10; fractionPart.append(remainder / denominatorLong); remainder = remainder % denominatorLong; index++; } if (remainder != 0){ Integer insertIndex = map.get(remainder); fractionPart.insert(insertIndex, "("); fractionPart.append(')'); } sb.append(fractionPart); return sb.toString(); }
结果: