[leetcode72]166. Fraction to Recurring Decimal手动实现除法

让人火大的一道题,特殊情况很多

不过也学到了:

java中int类型的最大值的绝对值比最小值的绝对值小1

int最小值的绝对值还是负的,除以-1也是

这种时候最好转为long类型进行处理

long num = (long)numerator;
        long den = (long)denominator;
        //两种特殊情况,一种是分母为0,一种是可以直接处尽
        if (den==0)
            return "";
        if (num%den==0)
            return num/den+"";
        //记录结果
        StringBuilder res = new StringBuilder();
        //判断商是负数的情况,在结果前边添加负号
        if ((num<0&&den>0)||(num>0&&den<0))
            res.append("-");
        //全部化成正数,不然会每位都有负号
         num = Math.abs(num);
         den = Math.abs(den);
        //添加上整数部分和.
        res.append(num/den+".");
        //记录当前余数
        long temp = num%den;
        //记录每次分子对应的那一位结果的index和用来判断是否开始循环
        Map<Long,Integer> map = new HashMap<>();
        int sta = res.length();
        while (temp!=0)
        {
            //如果开始循环,跳出
            if (map.containsKey(temp))
                break;
            //如果不是循环,那就记录位置
            map.put(temp,sta);
            //记录此次相除的结果
            res.append(temp*10/den);
            //更新余数
            temp= (((long)(temp*10))%den);
            //位置前移
            sta++;
        }
        //有两种情况会跳出循环,一种是没有余数了,直接返回,一种是商是循环小数
        if (temp==0)
            return new String(res);
        //查询开始循环的位置
        int left = map.get(temp);
        res.insert(left,"(");
        res.append(")");
        return new String(res);
原文地址:https://www.cnblogs.com/stAr-1/p/8305659.html