代码之家  ›  专栏  ›  技术社区  ›  Adam P

C#-for循环以奇怪的间隔冻结

  •  1
  • Adam P  · 技术社区  · 16 年前

    我正在研究 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 回复  |  直到 11 年前
        1
  •  4
  •   Kobi    16 年前

    我用另一种方法解决了这个问题,通过缓存每个步骤的结果,我发现了你的问题。我怀疑你的节目会停止。
    num = (3 * num) + 1 可能溢出 Int32.MaxValue
    long 为了你的x。

        2
  •  0
  •   Incognito    16 年前

    while (num != 1) .

        3
  •  0
  •   starblue    16 年前

    在内部while循环中击中1之前的Collatz序列太短,不会导致明显的延迟,如果它们会,那么应该总是在相同的数字下发生。

    推荐文章