[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);