我正在研究 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();
程序每次运行时挂起的数字是不同的,似乎没有遵循任何固定的模式。你知道为什么会这样吗?提前谢谢。
我用另一种方法解决了这个问题,通过缓存每个步骤的结果,我发现了你的问题。我怀疑你的节目会停止。 num = (3 * num) + 1 可能溢出 Int32.MaxValue long 为了你的x。
num = (3 * num) + 1
Int32.MaxValue
long
while (num != 1) .
while (num != 1)
在内部while循环中击中1之前的Collatz序列太短,不会导致明显的延迟,如果它们会,那么应该总是在相同的数字下发生。