C# - for Loop Freezes at strange intervals
I am working on Problem 14 on Project Euler, and my code seems to freeze at random intervals for no apparent reason.
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();
The number that the program hangs at is different each time I run it and doesn't seem to follow any set patterns. Any ideas on why it would be hanging like this? Thanks in advance.
I've solved it in another way, by caching the result for each step, and I've found your problem. I doubt your program ever stops.
The statement num = (3 * num) + 1
may overflow over Int32.MaxValue
and result in a negative number and an infinite loop(?).
In this case, you can solve the problem by using long
for your x.
If goes into infinite loop in while (num != 1)
.
I bet that this version doesn't freeze, there's no reason it should do that.
The Collatz sequences before you hit 1 in the inner while loop are too short to lead to a noticeable delay, and if they would that should always happen at the same numbers.
If you add console output inside the loop then this may allocate memory, and the pauses you see could be due to garbage collection.
精彩评论