最长的 Collat​​z 序列 - 欧拉计划 #14

Longest Collatz Sequence - Prokect Euler #14

The following iterative sequence is defined for the set of positive integers:

n → n/2 (n is even) n → 3n + 1 (n is odd)

Using the rule above and starting with 13, we generate the following sequence:

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.

Which starting number, under one million, produces the longest chain?

NOTE: Once the chain starts the terms are allowed to go above one million.

这是任务,这是我的解决方案:

     #include <iostream>
     using namespace std;

     int n;
     int start_n;
     bool n_even = false;
     int sequence_length = 0;
     int longest_sequence = 0;
     int longest_sequence_number;

     int main()
     {
     for (n = 2; n <= 1000000; n++)
     {
    start_n = n;

    cout << n << endl;

    do
    {
        sequence_length += 1;
        if (n % 2 == 0)
        {
            n_even = true;
        }
        else
        {
            n_even = false;
        }

        if (n_even == true)
        {
            n = n / 2;
        }
        else
        {
            n = 3 * n + 1;
        }
    } while (n == 1);

    if (sequence_length > longest_sequence)
    {
        longest_sequence = sequence_length;
        longest_sequence_number = start_n;
        sequence_length = 0;
    }
    else
    {
        sequence_length = 0;
    } 
}

cout << "Number with the longest sequence: " << longest_sequence_number << endl;

int end;
cin >> end;

}

我独立测试了序列的求值和n的生成,两者都有效。但是,当我将它们放在一起时,地板循环会生成 2、5、17、53、161、485、1457、4373、13121、39365、118097、354293,并表示最长序列的数字是 2。

我的 for 循环和/或 while 循环有问题吗?

我可以立即发现您的代码中至少有 2 个问题:

  • 在您的 "sequence-generation" 中,您更改 n,您也将其用作 for 循环中的计数器。不要这样做,最好将 for 循环更改为递增 start_n 并将 n 用于序列,反之亦然。
  • 您的序列继续 while(n==1) - 不应该是 while(n!=1) 吗?