-2

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

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

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

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 可以看出,这个序列(从 13 开始,到 1 结束)包含 10 个项。尽管尚未证明(科拉茨问题),但人们认为所有起始数字都以 1 结束。

哪个起始数字(低于 100 万)产生最长的链?

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

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

     #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 循环或两者都有问题吗?

4

1 回答 1

1

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

  • 在您的“序列生成”中,您更改n了,您也将其用作 for 循环中的计数器。不要这样做,最好将您的 for 循环更改为递增 start_n 并将 n 用于序列,反之亦然。
  • 你的序列继续while(n==1)- 不应该while(n!=1)吗?
于 2016-02-14T12:30:56.547 回答