【发布时间】:2014-10-24 21:39:24
【问题描述】:
我正在尝试在 c++ 中完成 Project Euler Problem 14,但我真的被卡住了。现在,当我运行问题时,它卡在 So Far:计数最高的数字:113370,计数为 155 到目前为止:计数最高的数字,但是当我尝试将 i 值更改为超过 113371 时,它可以工作。怎么回事??
问题是:
下面的迭代序列是为正数的集合定义的 整数:n → n/2(n 为偶数)n → 3n + 1(n 为奇数)
使用上面的规则并从 13 开始,我们生成以下内容 顺序:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 可以看出,这 序列(从 13 开始,在 1 结束)包含 10 个术语。 虽然它还没有被证明(Collatz Problem),但它是 以为所有的起始数字都以 1 结束。哪个起始数字, 一百万以下,生产最长的链条?
#include<stdio.h>
int main() {
int limit = 1000000;
int highNum, number, i;
int highCount = 0;
int count = 0;
for( number = 13; number <= 1000000; number++ )
{
i = number;
while( i != 1 ) {
if (( i % 2 ) != 0 ) {
i = ( i * 3 ) + 1;
count++;
}
else {
count++;
i /= 2;
}
}
count++;
printf( "So Far: the number with the highest count: %d with the count of %d\n",
number, count );
if( highCount < count ) {
highCount = count;
highNum = number;
}
count = 0;
//break;
}
printf( "The number with the highest count: %d with the count of %d\n",
highNum, highCount );
}
【问题讨论】:
-
如果程序对于相对较小的数字可以正常工作,但对于较大的数字“陷入无限循环”,则很可能不是无限循环,您的算法很慢。
-
您的问题是您一遍又一遍地重新计算相同的部分结果。
-
检查你使用的数据类型的限制,使用 unsigned long int
-
@PictureMeAndYou:您的限制是 1000000,但是当您计算每个序列的长度时,一些 中间 值将超出 32 位
int的范围。 -
实际上,按照同样的思路,在显而易见的策略中,您可以立即丢弃 1-500000 之间的每个数字作为最长链,因为总是会有一个链一的值加倍更长。您还可以丢弃
(N-1)%3==0所在的所有号码。这将可能性的数量减少了 66%。