为正整数集定义了以下迭代序列:
n→n / 2(n是偶数) n→3n + 1(n为奇数)
使用上面的规则并从13开始,我们生成以下序列:
13→40→20→10→5→16→8→4→2→1 可以看出,该序列(从13开始并在1结束)包含10个项。虽然尚未证实(Collatz问题),但据认为所有起始数字都以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循环或两者都有问题吗?
答案 0 :(得分:1)
我可以立即发现您的代码中至少有两个问题:
n
,你也在你的for循环中用作计数器。不要这样做,最好更改你的for循环以增加start_n并使用n作为序列,反之亦然。while(n==1)
- 不应该是while(n!=1)
吗?