【问题标题】:Searching longest chain in Collatz sequence in Java, loop not terminating在Java中搜索Collat​​z序列中的最长链,循环不终止
【发布时间】:2016-05-01 07:43:52
【问题描述】:

我想应用 Collat​​z 序列并将其应用于从 1 到 10^6 的所有数字,并返回具有达到 1 所需的最大链的数字。但是,我的循环似乎没有终止Eclipse,我不知道为什么,我什至无法在控制台中显示我的所有打印,尽管我希望每一步都显示出来。

collat​​z 序列由以下规则计算:

  • 如果n是奇数,下一个数是n/2

  • 如果n是偶数,下一个数是3n + 1

这是我目前所拥有的:

public static long collatz() {

    long res = 0;
    long n = 1;
    long count = 0;
    long largestCount = 0;
    long t = 0;

    for (long k = 1; k <= 20; k++) {

        n = k;

        while (n != 1) {

            if ((n % 2) == 0) {
                n = n / 2;
                count = count + 1;
            }

            else {
                n = (3 * n) + 1;
                count = count + 1;

            }

            if (count > largestCount) {
                largestCount = count;
                res = k;
            }
        }
    }

    System.out.println(res);
    return res;

}

【问题讨论】:

  • 你等得够久了吗?我将k &lt;= 1000000 更改为k &lt;= 20,这个程序退出了。
  • 这应该正常执行。您正在打印一堆东西的事实导致延迟
  • 根据this simulation,打印将是 264,868,848 行 + 1(“结果:”行)。为什么要这么多行?
  • 感谢您的回答。我删除了打印并将 k 更改为 k

标签: java collatz


【解决方案1】:

您的代码应该可以正常运行。虽然它不是工作代码。 您正在检查条件以查看当前 count 是否大于当前 largest count inside while 循环,这实际上没有意义,因为您需要获取 collat​​z 的长度序列,然后将其与当前最大值进行比较。除此之外,您的代码很好。 :)

这是我写的,如果你有兴趣的话。

final int number = 1000000;

long sequenceLength = 0;
long startingNumber = 0;
long sequence;

for (int i = 2; i <= number; i++) {
    int length = 1;
    sequence = i;
    while (sequence != 1) {
        if ((sequence % 2) == 0) {
            sequence = sequence / 2;
        } else {
            sequence = sequence * 3 + 1;
        }
        length++;
    }

    //Check if sequence is the best solution
    if (length > sequenceLength) {
        sequenceLength = length;
        startingNumber = i;
    }
}
System.out.println(startingNumber);

【讨论】:

  • 谢谢你的回答,但你能解释一下你的代码的不同之处吗?对我来说它看起来一样,除了我的指纹。
  • @CatTran 当然!您正在检查条件以查看当前 count 是否大于当前最大计数 inside while 循环,这实际上没有意义,因为您需要获取 collat​​z 序列的长度然后,检查它的大小。否则,您的代码很好。 :)
  • @CatTran 如果您的问题得到解决或接近解决方案,您可以接受/支持答案,那就太好了。来自here,“接受答案很重要,因为它既奖励海报解决您的问题,又通知其他人您的问题已解决。”
  • 好吧,我明白了。再次感谢你。很抱歉没有接受,这是我在 stackoverflow 上的第一篇文章。
【解决方案2】:

它会运行,但总是会打印最后测试的数字,因为您没有重置 count

我还将 count 值的增量移出 if/else 语句,因为增量不依赖于 n 的值。

我已经在 while 循环之后移动了 largestCount 的更新。

public static long collatz() {

    long res = 0;
    long n = 1;
    long count = 0;
    long largestCount = 0;
    long t = 0;

    for (long k = 1; k <= 20; k++) {

        n = k;
        count = 0; // start every sequence with count = 0

        while (n != 1) {

            if ((n % 2) == 0) {
                n = n / 2;
            }
            else {
                n = (3 * n) + 1;
            }
            count = count + 1;
        }
        if (count > largestCount) {
            largestCount = count;
            res = k;
        }
    }

    System.out.println(res);
    return res;
}

【讨论】:

    【解决方案3】:

    如果你阅读了我的解决方案,你会看到为一堆代码行应该做的事情编写 cmets 是如何非常有用的,并且使代码自我记录..

    Try Online

    public static long collatz(int maxN)
    {
        long res = 0, n = 1, count = 0, largestCount = 0, t = 0;
    
        // for K in [1, max-N]
        for (long k = 1; k <= maxN; k++)
        {
            // reset count to zero
            n = k; count = 0;
    
            // count how many steps to get to 1
            while (n != 1)
            {
                // n = collatz(n)
                n = (n%2==0 ? n/2 : (3*n)+1);
    
                count++; // count the step
            }
    
            // check for maximum count
            if (count > largestCount)
            {
                largestCount = count;
                res = k;
            }
        }
    
        return res; // return maximum solution
    }
    

    【讨论】:

      【解决方案4】:

      在 C# 或 Visual basic 中使用 Biginteger 而不是 Long

      例如http://herbert-helling.de/VB_Tests/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 2016-05-29
        相关资源
        最近更新 更多