最近发现了3n+1问题,想写一个简单的代码来做这个问题。

这一切都有效,但在诸如 999,999,999 之类的高奇数时,它会变为负数并重复无限循环,我不知道为什么。

// if n is odd  n = 3n+1
// if n is even n = n/2
while (true)
{
    int n;
    Console.WriteLine("Enter a positive whole number greater than one: ");
    while (!Int32.TryParse(Console.ReadLine(), out n))
    {
        Console.WriteLine("Enter a positive whole number greater than one: ");
    }
    while (n != 1)
    {
        if (n % 2 == 0)
        {
            n /= 2;
            Console.WriteLine("n / 2     = " + n);
        }
        else
        {
            n = 3 * n + 1;
            Console.WriteLine("3 * n + 1 = " + n);
        }
    }
    Console.ReadLine();
    Console.Clear();
}

我究竟做错了什么?谢谢!

最佳答案

这是由于整数溢出而发生的:



您可以使用 64 位整数类型,以获得更大范围的整数。显然,在后一种情况下也可以注意到溢出,但它会以非常大的数量发生。使用 64 位整数,您可以表示

18,446,744,073,709,551,615 numbers

而使用 32 位整数,您可以表示
4,294,967,295 numbers

Int32Int64 的情况下,您应该将上述数字除以二并取商,这将是可以表示的最大正数。应该这样做,因为 Int32Int64 都是有符号整数。

更好的方法是使用 UInt64 ,参见 here ,它可用于表示值范围为 0 到 18,446,744,073,709,551,615 的无符号整数。

在这种情况下,也可以明显地注意到溢出。

关于c# - 3n+1 给出负数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47616284/

10-13 08:55