- 题目
- 题解
题链:166. 分数到小数
使用小学数学的长除法模拟解决,分三步走:
- 判断是否可以直接整除,可以整除直接相除返回结果即可
- 判断符号是否一正一负,是的话转为正数进行相除、并且结果记得添上负号。
- 小数方面的处理、使用一个hashmap判断是否存在循环小数、存在则加上括号、使用stringbulider的insert在出现重复余数的下标插入。没有最后会直接得到小数结果。
需要注意的是在求余那一块可能会出现整形溢出的情况、所以改成long进行运算。
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
long a = numerator,b = denominator;
if (a%b == 0){
return String.valueOf(a/b);
}
StringBuilder sb = new StringBuilder();
if (a*b < 0){
sb.append('-');
}
a = Math.abs(a);
b = Math.abs(b);
sb.append(a/b);
sb.append('.');
long rem = a%b;
StringBuilder di = new StringBuilder();
HashMap map = new HashMap<>();
int i = 0;
while (rem != 0 && !map.containsKey(rem)){
map.put(rem,i++);
rem *= 10;
di.append(rem/b);
rem = rem%b;
}
if (rem != 0){
di.insert(map.get(rem),"(");
di.append(')');
}
return sb.append(di.toString()).toString();
}
}



