给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 10^4 。
示例 1:
输入:numerator = 1, denominator = 2
输出:"0.5"
方法一:长除法
长除法在本题中的应用:
我们可以对被除数每次进行除法运算后的余数进行处理,若不为零则将余数*10(向前进一位),再用除数除以该余数计算当前位数下的值,并对当前余数求余更新余数的值;若为零则代表已经除尽可以中断除法。
在实际操作中,我们还需注意以下几点
- 因为给定的除数与被除数可取任意int值,为防止数据溢出先将其转换为long型
- 为了便于运算,我们在开始判断结果的符号并将除数与被除数取绝对值
- 在对括号进行处理时,因为无限循环小数的循环位数只可能出现在小数位,所以对于标志变量的初始值应设置为整数部分长度,并在每次循环后进行更新。
- 对于是否出现重复小数位,我们可以用 HashMap 储存余数的值,通过判断余数是否重复来判别。
private final HashMapmap = new HashMap<>(1<<5); public String fractionToDecimal(int numerator, int denominator) { if (numerator == 0) return "0"; boolean positive = numerator >= 0 && denominator >= 0 || numerator < 0 && denominator < 0; long a = numerator, b = denominator; a = (a >= 0 ? a : -a); b = (b >= 0 ? b : -b); StringBuilder builder = new StringBuilder(); builder.append(a/b); long remain = a%b * 10; if (remain != 0) builder.append('.'); int index = builder.length(); while (remain != 0) { if (map.containsKey(remain)) { builder.insert(index, ')'); builder.insert(map.get(remain), (Object) '('); break; } else { map.put(remain, index); builder.append(remain/b); remain = remain%b * 10; } ++ index; } return positive ? builder.toString() : "-" + builder; }


![LeetCode-每日一题 166. 分数到小数 [Java实现] [极速] LeetCode-每日一题 166. 分数到小数 [Java实现] [极速]](http://www.mshxw.com/aiimages/31/287440.png)
