本文主要是介绍leetcode:(166) Fraction To Recurring Decimal(java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
package LeetCode_HashTable;import java.util.HashMap;/*** 题目:* 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.* 解题思路:* 整数部分很好处理,只要注意正负号的区分就行了,但是如何处理小数部分呢。如果只是简单的除法,那我们每次把余数乘以10,* 再除以被除数就可以得到当前位的小数了,得到新的余数,直到余数为0。难点在于,对于无尽循环小数,我们一直这么做永远也不能让余数变为0。* 这里我们可以用一个哈希表记录每次的余数,如果余数出现重复的时候,说明就产生循环了。为了能找出小数中循环的部分,* 我们在用哈希表时,还要把每个余数对应的小数位记录下来,这样子我们一旦遇到重复,就知道是从哪里开始循环的。* 注意:* 如果输入的被除数很大,那么余数乘以10有可能溢出,所以我们用long来保存numerator和denominator。**/public class FractionToDecimal_166_1020 {public String FractionToDecimal(int numerator, int denominator) {StringBuilder result = new StringBuilder();//判断分子是否为0if (numerator == 0) {return "0";}//判断正负//result.append(((numerator > 0) ^ (denominator > 0)) ? "-" : "");if ((numerator > 0) ^ (denominator > 0)) {result.append("-");} elseresult.append("");Long num = Math.abs((long) numerator);Long den = Math.abs((long) denominator);//整数部分result.append(num / den);num = num % den;if (num == 0) {return result.toString();}//确定小数部分result.append(".");HashMap<Long, Integer> map = new HashMap<>();map.put(num, result.length());while (num != 0) {num *= 10;result.append(num / den);num %= den;if (map.containsKey(num)) {int index = map.get(num);result.insert(index, "(");result.append(")");break;} else map.put(num, result.length());}return result.toString();}public static void main(String[] args) {int numerator = -1;int denominator = -2147483648;FractionToDecimal_166_1020 test = new FractionToDecimal_166_1020();String result = test.FractionToDecimal(numerator, denominator);System.out.println(result);} }
这篇关于leetcode:(166) Fraction To Recurring Decimal(java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!