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
你应该除以二上面的数字,并采取商数,这将是可以表示的最大正数。这应该完成,因为Int32
和Int64
都是有符号整数。
更好的方法是利用UInt64
,参见here,它可以用来表示值为0到18,446,744,073,709,551,615的无符号整数。
定义在这种情况下也可以注意到溢出。
回答:
int
最大为2,147,483,647
。 3n
当n
是999,999,999
将是更大和溢出,这将导致n
为负n = 3 * n + 1;
以上是 3n + 1给出负数 的全部内容, 来源链接: utcz.com/qa/259931.html