1. 题目
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
示例 1:
输入:numerator = 1, denominator = 2
输出:“0.5”
示例 2:
输入:numerator = 2, denominator = 1
输出:“2”
2. 题解
2.1 解法1: 模拟竖式长除法
注意边界情况的处理
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
// 判断特殊情况
if (numerator == 0) {
return "0";
}
StringBuilder ans = new StringBuilder();
if ((numerator < 0 && denominator > 0) || (numerator > 0 && denominator < 0)) {
ans.append("-");
}
// 原数处理, 取绝对值
long up = Math.abs(Long.valueOf(numerator));
long down = Math.abs(Long.valueOf(denominator));
// 计算整数部分
ans.append(String.valueOf(up / down));
long remainder = up % down;
if (remainder == 0) {
return ans.toString();
}
ans.append(".");
// 计算小数部分
// 哈希表, key 存储余数值, value存储 其出现的商位置
Map<Long, Integer> map = new HashMap<>();
while (remainder != 0) {
// 对于已经出现过的余数, 其为循环部分
if (map.containsKey(remainder)) {
ans.insert(map.get(remainder), "(");
ans.append(")");
break;
} else {
map.put(remainder, ans.length());
remainder *= 10;
ans.append(remainder / down);
remainder %= down;
}
}
return ans.toString();
}
}
参考: 官方题解