3n + 1给出负数

时间:2017-12-03 07:34:20

标签: c# collatz

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

我做错了什么?谢谢!

2 个答案:

答案 0 :(得分:3)

由于整数溢出

而发生这种情况
  

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

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

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

对于32位整数,您可以表示

4,294,967,295 numbers

如果是Int32Int64,您应该将上面的数字除以2并取商,这将是可以表示的最大正数。应该这样做,因为Int32Int64都是有符号整数。

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

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

答案 1 :(得分:2)

int最高为2,147,483,647。当3n n999,999,999时,n会更大且溢出,导致n = 3 * n + 1;

之后tagged_sents = corp.tagged_sents() random.shuffle(tagged_sents) 为负数