正在研究这个问题,也引用了一些类似的解决方案。我感到困惑的一件事是,为什么我们只要有一个重复数字就打破循环?有没有可能这个号码重复2-3次然后换成另一个不同的号码?谢谢。
我指的是这部分,
if (map.containsKey(num)) {
int index = map.get(num);
res.insert(index, "(");
res.append(")");
break;
}
问题,
给定两个代表分数分子和分母的整数,以字符串格式返回分数。
如果小数部分重复,请将重复部分括在括号中。
例如,
给定分子 = 1,分母 = 2,返回“0.5”。 给定分子 = 2,分母 = 1,返回“2”。 给定分子 = 2,分母 = 3,返回“0.(6)”。
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) {
return "0";
}
StringBuilder res = new StringBuilder();
// "+" or "-"
res.append(((numerator > 0) ^ (denominator > 0)) ? "-" : "");
long num = Math.abs((long)numerator);
long den = Math.abs((long)denominator);
// integral part
res.append(num / den);
num %= den;
if (num == 0) {
return res.toString();
}
// fractional part
res.append(".");
HashMap<Long, Integer> map = new HashMap<Long, Integer>();
map.put(num, res.length());
while (num != 0) {
num *= 10;
res.append(num / den);
num %= den;
if (map.containsKey(num)) {
int index = map.get(num);
res.insert(index, "(");
res.append(")");
break;
}
else {
map.put(num, res.length());
}
}
return res.toString();
}
}
提前致谢, 林
最佳答案
代码在看到重复的数字时不会停止。当它注意到它已达到它已经处于的状态时它会停止。如果它再次达到相同的状态,则意味着我们将重复我们已经完成的除法,这意味着股息和余数将继续相同,我们将执行我们已经完成的相同系列步骤。
发生这种情况时,意味着重复,它会停止并添加括号。
例如,让我们将 123 除以 999。这应该给我们重复小数 0.123123123...,因此输出应该是 0.(123)
。
- 123/999 是 0。余数是 123。我们从
0 开始。
- 将余数乘以 10。现在我们有 1230/999。被除数为 1,余数为 231。现在我们有
0.1
- 将余数乘以 10。现在我们有 2310/999。被除数是 2,余数是 312。现在我们有
0.12
- 将余数乘以 10。现在我们有 3120/999。被除数是 3,余数是 123。现在我们有
0.123
- 将余数乘以 10。现在我们有 1230/999...等等,我们已经完成了!这意味着随着我们继续 split ,我们将一次又一次地达到那个数字。停止并将重复部分括起来。
map 会告诉我们已经划分了哪些数字,以及 StringBuilder
中的哪个索引。当我们找到一个已经除过的数字时,我们使用该索引来知道在哪里插入括号。
关于java - 分数到循环小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33445238/