3n + 1给出负数

我最近发现了关于3n + 1的问题,并想写一个简单的代码来解决这个问题。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 

Int32壳体和Int64你应该除以二上面的数字,并采取商数,这将是可以表示的最大正数。这应该完成,因为Int32Int64都是有符号整数。

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

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

回答:

int最大为2,147,483,6473nn999,999,999将是更大和溢出,这将导致n为负n = 3 * n + 1;

以上是 3n + 1给出负数 的全部内容, 来源链接: utcz.com/qa/259931.html

回到顶部