我最近发现了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();
}
我做错了什么?谢谢!
答案 0 :(得分:3)
由于整数溢出:
而发生这种情况在计算机编程中,算术时会发生整数溢出 操作尝试创建一个在...之外的数值 可以用给定位数表示的范围 - 或者 大于最大值或小于最小可表示值。
您可以使用64位整数类型,以获得更大范围的整数。显然,在后一种情况下也可以注意到溢出,但它会发生在非常大的数量中。使用64位整数,您可以表示
18,446,744,073,709,551,615 numbers
对于32位整数,您可以表示
4,294,967,295 numbers
如果是Int32
和Int64
,您应该将上面的数字除以2并取商,这将是可以表示的最大正数。应该这样做,因为Int32
和Int64
都是有符号整数。
更好的方法是使用UInt64
,参见here,它可用于表示值为0到18,446,744,073,709,551,615的无符号整数。
在这种情况下,也可以注意到溢出。
答案 1 :(得分:2)
int
最高为2,147,483,647
。当3n
n
为999,999,999
时,n
会更大且溢出,导致n = 3 * n + 1;
tagged_sents = corp.tagged_sents()
random.shuffle(tagged_sents)
为负数