题目:
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: “0.5”
示例 2:
输入: numerator = 2, denominator = 1
输出: “2”
示例 3:
输入: numerator = 2, denominator = 3
输出: “0.(6)”
题解:
- 注意 这里面有个坑 当要把Integer.MIN_VALUE通过Math.abs()方法取绝对值时,如果直接使用
Math.abs(Integer.MIN_VALUE)转换之后还是负数,得用Long.valueOf(Integer.MIN_VALUE)进行包装才行。
import java.util.HashMap;
import java.util.Map;
/**
* @Author dfpeng
* @Date 2019/7/30
*/
public class Solution {
public static String fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) {
return "0";
}
StringBuilder sb = new StringBuilder();
if (numerator<0 ^ denominator< 0) {
sb.append("-");
}
long a = Math.abs(Long.valueOf(numerator));
long b = Math.abs(Long.valueOf(denominator));
long mod = a % b;
sb.append(String.valueOf(a / b));
if (mod == 0) {
return sb.toString();
}
sb.append(".");
Map<Long, Integer> map = new HashMap<>();
while (mod != 0) {
if (map.containsKey(mod)) {
sb.insert(map.get(mod), "(");
sb.append(")");
break;
}
map.put(mod, sb.length());
mod *= 10;
sb.append(String.valueOf(mod / b));
mod %= b;
}
return sb.toString();
}
}