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