分数到小数

题目:

思路:

【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();
    }
}

 

posted @ 2023-01-11 15:37  忧愁的chafry  阅读(29)  评论(0编辑  收藏  举报