分数到小数
题目:
思路:
【1】由于是int类型的相除得到的小数,其实是会出现溢出的情况,如-2147483648/-1。所以为了避免其实可以采用long类型扩大范围。
【2】整数部分直接/就可以得到了,问题是小数部分会存在循环,从数学角度,循环的产生本质上是因为余数除以除数除不尽,而且会出现重复的现象,那么基于此便可以用额外的辅助空间记录,如果余数出现重复的,那么就产生了循环。
代码展示:
//执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户 //内存消耗:39 MB, 在所有 Java 提交中击败了59.30%的用户 class Solution { public String fractionToDecimal(int numerator, int denominator) { if (numerator == 0 || denominator == 1)return String.valueOf(numerator) ; long n = Math.abs((long)numerator); long d = Math.abs((long) denominator); StringBuilder sb = new StringBuilder(); HashMap<Long,Integer> map = new HashMap<>(); sb.append(n / d); long mo = n % d; if (mo != 0)sb.append("."); map.put(mo,sb.length()); while (mo != 0){ sb.append(mo * 10 / d); mo = mo * 10 % d; if (map.containsKey(mo)){ sb.insert(map.get(mo),"("); sb.append(")"); break; } map.put(mo,sb.length()); } return ( (numerator < 0 ^ denominator < 0) ? "-" : "") + sb.toString(); } }