LeetCode 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)”.
问题分析
这道题就是求除法,但是需要考虑循环小数的问题。那么如何考虑呢?
对于循环小数来说。余数肯定出现重复。这句话该怎么理解呢。
1/7 = 0.14285714285714
运算 | 结果 | 余数 |
---|---|---|
1/7 | 0 | 1 |
10/7 | 1 | 3 |
30/7 | 4 | 2 |
20/7 | 2 | 6 |
60/7 | 8 | 4 |
40/7 | 3 | 5 |
50/7 | 7 | 1 |
10/7 | 1 | 3 |
30/7 | 4 | 2 |
从上面计算过程可以看出,余数1出现重复以后,后面的小数位都是重复的。所以保存余数,然后如果出现余数就说明开始了循环的过程。。考虑到对于给定denominator除数来说,可以初始化一个被除数数组。因为不能确定被除数最大是多少,这里我使用的是Map进行保存。
Java代码
public String fractionToDecimal(int numerator, int denominator) {
if(numerator==0) return "0";
boolean isP = true;
long number = numerator;
long de = denominator;
StringBuilder sb = new StringBuilder();
if(de*number<0) sb.append("-");
number=Math.abs(number);
de = Math.abs(de);
//首先计算整数部分
while(number>=de){
sb.append(number/de);
number = number%de;
}
if(number==0){
return sb.toString();
}
if(sb.length()<1||sb.charAt(sb.length()-1)=='-') sb.append("0");
//计算小数部分,小数部分要考虑小数的循环问题。小数的循环问题
Map<Long,Integer> map = new HashMap<>();
StringBuilder xiaosu = new StringBuilder();
int index = 0;
while (number!=0){
if(map.containsKey(number)){
xiaosu.insert(map.get(number),"(");
xiaosu.append(")");
break;
}
map.put(number,index);
number*=10;
xiaosu.append(number/de);
number=number%de;
index++;
}
return sb.append(".").append(xiaosu).toString();
}
LeetCode学习笔记持续更新
GitHub地址 https://github.com/yanqinghe/leetcode
CSDN博客地址 http://blog.csdn.net/yanqinghe123/article/category/7176678