给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1
输出: "2"
示例 3:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
答案:
1public String fractionToDecimal(int numerator, int denominator) {
2 if (numerator == 0) {
3 return "0";
4 }
5 StringBuilder res = new StringBuilder();
6 res.append(((numerator > 0) ^ (denominator > 0)) ? "-" : "");
7 long num = Math.abs((long) numerator);
8 long den = Math.abs((long) denominator);
9 // 整数部分
10 res.append(num / den);
11 num %= den;
12 if (num == 0) {
13 return res.toString();
14 }
15 // 小数部分
16 res.append(".");
17 HashMap<Long, Integer> map = new HashMap<Long, Integer>();
18 map.put(num, res.length());
19 while (num != 0) {
20 num *= 10;
21 res.append(num / den);
22 num %= den;
23 if (map.containsKey(num)) {
24 int index = map.get(num);
25 res.insert(index, "(");
26 res.append(")");
27 break;
28 } else {
29 map.put(num, res.length());
30 }
31 }
32 return res.toString();
33}
解析:
第6行是判断符号位,如果被除数和除数符号相同,则结果为正,否则为负,先计算整数部分,然后再计算小数部分。整数部分比较简单,小数部分我们只需要保存每次相除的余数即可,然后把它保存在HashMap中,如果有重复的说明出现了循环,这题我们还可以参照前面的23,倒数的循环节