给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2 输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1 输出: "2"
示例 3:
输入: numerator = 2, denominator = 3 输出: "0.(6)"
思路:
相除后记录余数,余数再去除以除数。 在这个过程中记录余数,如果出现了重复的余数,那么必定是循环体结构了。
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if (numerator == Integer.MIN_VALUE && denominator == -1) {
//边界条件,没法直接除,因为除完结果溢出
return "2147483648";
}
if (numerator == -1 && denominator == Integer.MIN_VALUE) {
//边界条件,都是int类型,没法除
return "0.0000000004656612873077392578125";
}
String res = "";
int shang = numerator / denominator;
int yushu = numerator % denominator;
if ((double) numerator / (double) denominator < 0 && shang == 0) {
//如果两个一正一负,除完shang为0,但是我们要的是-0
res += "-";
}
res += shang;
if (yushu == 0) {
return res;
}
res += ".";
Map<Integer, Integer> map = new HashMap<>();
int i = 0;
while (yushu != 0) {
yushu = Math.abs(yushu);
denominator = Math.abs(denominator);
yushu *= 10;
if (map.containsKey(yushu)) {
int start = map.get(yushu);
int end = res.length();
res = res.substring(0, start) + "(" + res.substring(start, end) + ")";
return res;
}
map.put(yushu, res.length());
shang = yushu / denominator;
yushu = yushu % denominator;
res += shang;
}
return res;
}
}