【问题标题】:3n+1 giving negative numbers3n+1 给出负数
【发布时间】:2017-12-03 07:34:20
【问题描述】:

我最近发现了 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();
}

我做错了什么?谢谢!

【问题讨论】:

标签: c# collatz


【解决方案1】:

这是由于整数溢出

在计算机编程中,当算术运算时会发生整数溢出 操作尝试创建一个超出 可以用给定位数表示的范围 - 要么 大于最大或小于最小可表示值。

您可以使用 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 的无符号整数。

在这种情况下也可以注意到溢出。

【讨论】:

    【解决方案2】:

    int 是最大的2,147,483,647。当n999,999,999 时,3n 将更大并溢出,这将导致nn = 3 * n + 1; 之后为负数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多