zoukankan      html  css  js  c++  java
  • [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);
  • 相关阅读:
    flex布局
    redis持久化的四种方式
    list all index in elasticsearch
    Java Thread停止关闭
    关于线程的一些操作方法
    将redis key打印到文本
    spout和bolt
    java读取redis的timeout异常
    storm中,ack与fail
    好文要收藏(大数据)
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8305659.html
Copyright © 2011-2022 走看看