zoukankan      html  css  js  c++  java
  • 166. Fraction to Recurring Decimal

    Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
    
    If the fractional part is repeating, enclose the repeating part in parentheses.
    
    For example,
    
    Given numerator = 1, denominator = 2, return "0.5".
    Given numerator = 2, denominator = 1, return "2".
    Given numerator = 2, denominator = 3, return "0.(6)".
    Credits:
    Special thanks to @Shangrila for adding this problem and creating all test cases.

    存在正负情况,处理方式是按正数处理,符号最后在判断,那么我们需要把除数和被除数取绝对值,那么问题就来了:由于整型数INT的取值范围是-2147483648~2147483647,而对-2147483648取绝对值就会超出范围,所以我们需要先转为long long型再取绝对值。那么怎么样找循环呢,肯定是再得到一个数字后要看看之前有没有出现这个数。为了节省搜索时间,我们采用哈希表来存数每个小数位上的数字。还有一个小技巧,由于我们要算出小数每一位,采取的方法是每次把余数乘10,再除以除数,得到的商即为小数的下一位数字。等到新算出来的数字在之前出现过,则在循环开始出加左括号,结束处加右括号。代码如下:

    public String fractionToDecimal(int numerator, int denominator) {
                long num = (long)numerator;
                long den = (long)denominator;
                boolean isNeg = false;
                if (num < 0) isNeg = !isNeg;
                if (den < 0) isNeg = !isNeg;
                num = Math.abs(num);
                den = Math.abs(den);
                HashMap<Long, Integer> dict = new HashMap<Long, Integer>();
                StringBuffer res = new StringBuffer();
                if (num == 0) return "0";
                long digit = num / den; //deal with integer part
                res.append(digit);
                num = (num % den) * 10;
                if (num != 0) res.append("."); //deal with decimal point
                else return res.toString();
                while (num != 0 && !dict.containsKey(num)) {
                    dict.put(num, res.length());
                    digit = num / den;
                    res.append(digit);
                    num = (num % den) * 10;
                }
                if (dict.containsKey(num)) {
                    res.insert(dict.get(num).intValue(), '(');
                    res.append(')');
                }
                if (isNeg) res.insert(0, '-');
                return res.toString();
            }
    

     res.insert(dict.get(num).intValue(), '(');  XXX.intValue()转化为int型, 这里不能自动拆箱,要用int  

    核心思想就是:模仿除法的过程,然后用hashmap存储numerator的值,如果出现了相同的numerator那么就出现了cycle,

    利用stringbuilder来append string,hashmap里面 key是numerator,value是stringbuilder.length,这样出现了cycle,知道如何去插入"(",再append")".

    还要记得在第一次除法完成之后,加上小数点,因为第一次除法就可以把整个整数部分全算出来了,接下来小数部分才是一位一位地算

    如何计算整数部分, 如何循环小数部分, 如何找循环点, 如何判断整出完, 如何判断结果正负.

    负数取绝对值转化为正数

  • 相关阅读:
    Golang教程:并发介绍
    Go在windows10 64位上安装
    ElasticSearch 聚合
    ElasticSearch深入搜索
    ElasticSearch基础入门
    php安装扩展
    报错提示优化
    NK3C程序配置
    NK3C 业务权限控制
    关于测试方法
  • 原文地址:https://www.cnblogs.com/apanda009/p/7169932.html
Copyright © 2011-2022 走看看