0

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

4 回答 4

0

您的代码应该可以正常运行。虽然它不是工作代码。您正在检查条件以查看当前count是否大于while 循环largest count 的当前值,这实际上没有意义,因为您需要获取 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);
于 2016-05-01T07:51:01.227 回答
0

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

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

而且我已经移动了largestCountwhile循环之后的更新。

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;
}
于 2016-05-01T08:28:29.767 回答
0

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

在线试用

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
}
于 2016-05-01T08:59:50.047 回答
0

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

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

于 2016-05-03T10:33:25.027 回答