最长的Collat​​z序列 - Prokect Euler#14

时间:2016-02-14 12:20:51

标签: c++ collatz

  

为正整数集定义了以下迭代序列:

     

n→n / 2(n是偶数)   n→3n + 1(n为奇数)

     

使用上面的规则并从13开始,我们生成以下序列:

     

13→40→20→10→5→16→8→4→2→1   可以看出,该序列(从13开始并在1结束)包含10个项。虽然尚未证实(Collat​​z问题),但据认为所有起始数字都以1结束。

     

哪个起始编号低于一百万,产生最长的链?

     

注意:一旦链条启动,条款允许超过一百万。

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

     #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,36365,118097,354293,并且说最长序列的数字是2.

我的for循环,while循环或两者都有问题吗?

1 个答案:

答案 0 :(得分:1)

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

  • 在你的&#34;序列生成&#34;你改变n,你也在你的for循环中用作计数器。不要这样做,最好更改你的for循环以增加start_n并使用n作为序列,反之亦然。
  • 您的序列会继续while(n==1) - 不应该是while(n!=1)吗?