我目前正在解决Project Euler 问题 14:
为正整数集定义了以下迭代序列:
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 Which starting number, under one million, produces the longest chain?
我设计了以下算法来解决这个问题:
- 我没有为每个数字单独查找序列,这将包含大量冗余计算,而是尝试从 1 向后开发序列。也就是说,从数字开始并预测它之前的元素。
- 由于可以生成多个系列,因此使用链表存储所有系列的最近编号。(这个想法是只存储那些具有较长系列的元素。)
- 我将循环这个,直到找到所有低于给定限制的数字;限制下的最后一个数字将具有最长的系列。
这是我的代码:
void series_generate(long num)
{
long n = 1;
addhead(n); //add 1 to list.
while (n < num)
{
series *p;
for (p = head; p != NULL; p = p->next)
{
long bf = p->num - 1;
if (p->num%2 == 0 && bf != 0 && bf%3 == 0) {
bf /= 3;
if (bf != 1)
addhead(bf);
if (bf < num)
n++;
}
p->num *= 2;
if ( p->num < num)
n++;
}
}
}
这是完整代码的链接。 但是,我没有得到预期的答案。谁能解释为什么这个算法不起作用?