java - 分数到循环小数

标签 java algorithm

正在研究这个问题,也引用了一些类似的解决方案。我感到困惑的一件事是,为什么我们只要有一个重复数字就打破循环?有没有可能这个号码重复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/

相关文章:

algorithm - 用于团查找的 Bron Kerbosh 算法 - 当枢轴顶点不存在时会发生什么?

python - 是否有一种算法可以查找总和小于给定 K 的子列表的数量?优于 O(N^2)

java - Guava 库 : What are its most useful and/or hidden features?

java - Spring Integration Kafka 与 Spring Kafka

java - 混淆字符串值java android

algorithm - 在迷宫中寻找输出的死胡同填充算法是否被视为回溯算法?

java - 最佳实践 : how to host server-side code in the maven repository

java - SQL 多条件

algorithm - 对于整数 A>0、B>0、N>0,找到整数 x>0、y>0,使得 N-(Ax+By) 是最小的非负数

python - 查找数组的连续总和