在Java中搜索Collat​​z序列中最长的链,循环不终止

时间:2016-05-01 07:43:53

标签: java collatz

我想应用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;

}

4 个答案:

答案 0 :(得分:0)

您的代码应该正常运行。虽然这不是有效的代码。 您正在检查条件,以查看当前count是否大于当前largest count 内部 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);

答案 1 :(得分:0)

它会运行,但它会始终打印最后一个测试的号码,因为您没有重置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;
}

答案 2 :(得分:0)

如果您阅读了我的解决方案,您可以看到如何编写一堆代码行应该做的注释是非常有用的,并使代码自我记录。

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
}

答案 3 :(得分:0)

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

e.g。 http://herbert-helling.de/VB_Tests/