1. 题目
2. 思路
(1) 长除法
-
关键在于如何判断小数部分是否是循环小数以及循环部分是哪一段数字。
-
计算小数部分时,每次将余数乘以10,然后计算小数的下一位数字,并得到新的余数。重复上述操作直到余数变成0或者找到循环部分。如果余数变成0,则结果是有限小数,将小数部分拼接到结果中;如果找到循环部分,则找到循环部分的开始位置和结束位置并加上括号,然后将小数部分拼接到结果中。
-
注意到对于相同的余数,计算得到的小数的下一位数字一定是相同的,因此如果计算过程中发现某一位的余数在之前已经出现过,则为找到循环节。
3. 代码
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.fractionToDecimal(-1, Integer.MIN_VALUE));
}
}
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
long numLong = numerator;
long denLong = denominator;
if (numLong % denLong == 0) {
return String.valueOf(numLong / denLong);
}
StringBuilder res = new StringBuilder();
//符号部分
if (numLong < 0 ^ denLong < 0) {
res.append('-');
}
//整数部分
numLong = Math.abs(numLong);
denLong = Math.abs(denLong);
res.append(numLong / denLong);
res.append('.');
//小数部分
Map<Long, Integer> map = new HashMap<>();
long remainder = numLong % denLong;
int index = res.length();
while (remainder != 0 && !map.containsKey(remainder)) {
map.put(remainder, index);
remainder *= 10;
res.append(remainder / denLong);
remainder %= denLong;
index++;
}
if (remainder != 0) {
int insertIndex = map.get(remainder);
res.insert(insertIndex, '(');
res.append(')');
}
return res.toString();
}
}