166. Fraction to Recurring Decimal

Posted apanda009

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.

这道题还是比较有意思的,开始还担心万一结果是无限不循环小数怎么办,百度之后才发现原来可以写成分数的都是有理数,而有理数要么是有限的,要么是无限循环小数,无限不循环的叫无理数,例如圆周率pi或自然数e等,小学数学没学好,汗!由于还存在正负情况,处理方式是按正数处理,符号最后在判断,那么我们需要把除数和被除数取绝对值,那么问题就来了:由于整型数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();
        }

  

 

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

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

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

以上是关于166. Fraction to Recurring Decimal的主要内容,如果未能解决你的问题,请参考以下文章

166. Fraction to Recurring Decimal

166. Fraction to Recurring Decimal

166. Fraction to Recurring Decimal

166. Fraction to Recurring Decimal

166. Fraction to Recurring Decimal

Leetcode 166 Fraction to Recurring Decimal