C# - 用于以奇怪的间隔进行循环冻结

时间:2010-07-06 04:13:59

标签: c# for-loop random freeze

我正在使用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();

每次运行程序时,程序挂起的编号都不同,并且似乎没有遵循任何设置模式。关于为什么它会像这样悬挂的任何想法?提前谢谢。

3 个答案:

答案 0 :(得分:4)

我以另一种方式解决了这个问题,通过缓存每个步骤的结果,我找到了你的问题。我怀疑你的节目是否会停止 语句num = (3 * num) + 1可能溢出Int32.MaxValue并导致负数和无限循环(?)。
在这种情况下,您可以使用long作为x来解决问题。

答案 1 :(得分:0)

如果在while (num != 1)进入无限循环。

答案 2 :(得分:0)

我敢打赌,这个版本不会冻结,没有理由应该这样做。

在内部while循环中击中1之前的Collat​​z序列太短而不会导致明显的延迟,并且如果它们应该始终以相同的数字发生。

如果你在循环中添加控制台输出,那么这可能会分配内存,你看到的暂停可能是由于垃圾收集。