我正在使用Project Euler上的Problem 14工作,我的代码似乎无间断地随机冻结。
static void Main()
{
int maxNum = 0;
int maxLength = 0;
for (int x = 2; x < 1000000; ++x)
{
int num = x;
int length = 0;
while (num != 1)
{
if (num % 2 == 0)
{
num /= 2;
length++;
}
else
{
num = (3 * num) + 1;
length++;
}
}
if (length > maxLength)
{
maxLength = length;
maxNum = x;
}
}
Console.WriteLine(maxNum);
Console.ReadLine();
每次运行程序时,程序挂起的编号都不同,并且似乎没有遵循任何设置模式。关于为什么它会像这样悬挂的任何想法?提前谢谢。
答案 0 :(得分:4)
我以另一种方式解决了这个问题,通过缓存每个步骤的结果,我找到了你的问题。我怀疑你的节目是否会停止
语句num = (3 * num) + 1
可能溢出Int32.MaxValue
并导致负数和无限循环(?)。
在这种情况下,您可以使用long
作为x来解决问题。
答案 1 :(得分:0)
如果在while (num != 1)
进入无限循环。
答案 2 :(得分:0)
我敢打赌,这个版本不会冻结,没有理由应该这样做。
在内部while循环中击中1之前的Collatz序列太短而不会导致明显的延迟,并且如果它们应该始终以相同的数字发生。
如果你在循环中添加控制台输出,那么这可能会分配内存,你看到的暂停可能是由于垃圾收集。