最近发现了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 的无符号整数。在这种情况下,也可以明显地注意到溢出。
关于c# - 3n+1 给出负数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47616284/