我是java编程语言的新手。 为什么这段代码中有不同的输出?可以向我解释这个问题吗?非常感谢你。 公共阶层Collatz {
public static void main(String[]arguments)
{ int max=0;
int real=0;
int a=0;
for (int i=2;i<1000000;i++)
{
real=i;
int count=1;
while(real>1)
{
if(real%2==0)
{
real=real/2;
}
else
{
real=3*real+1;
}
count++;
}
if(count>max){max=count;a=i;}
}
System.out.println(a+"&"+max);}
输出为910107&amp; 476 公共阶层Collatz {
public static void main(String[]arguments)
{ long max=0;
long real=0;
long a=0;
for (int i=2;i<1000000;i++)
{
real=i;
int count=1;
while(real>1)
{
if(real%2==0)
{
real=real/2;
}
else
{
real=3*real+1;
}
count++;
}
if(count>max){max=count;a=i;}
}
System.out.println(a+"&"+max);}
输出为837799&amp; 525 可以告诉我是什么问题吗?谢谢。
答案 0 :(得分:0)
因为您的值溢出int
(可能是long
)。
for (int i=2;i<1000000;i++){
real=i;
int count=1;
while(real>1)
您将循环很多时间,尤其是while
循环
由于你进行了乘法运算,因此该值会快速上升并达到最大值并开始回到最小值(“更大”的负值)并继续使用它。
int
和long
都有不同的最大值,因此溢出会在不同时刻发生,从而产生不同的结果。
您可以找到每种基本类型here的长度,但以下是有趣的部分:
int :默认情况下,int数据类型是32位带符号的二进制补码整数,其最小值为 -2 ^ 31,最大值为2 ^ 31 -1 即可。在Java SE 8及更高版本中,您可以使用int数据类型来表示无符号的32位整数,其最小值为0,最大值为2 ^ 32-1。使用Integer类将int数据类型用作无符号整数。有关更多信息,请参阅数字类一节。已经将诸如compareUnsigned,divideUnsigned等静态方法添加到Integer类中,以支持无符号整数的算术运算。
long :长数据类型是64位二进制补码整数。有符号长整数的最小值为 -2 ^ 63,最大值为2 ^ 63-1 。在Java SE 8及更高版本中,您可以使用long数据类型来表示无符号的64位长,其最小值为0,最大值为2 ^ 64-1。当需要比int提供的值更宽的值时,请使用此数据类型。 Long类还包含compareUnsigned,divideUnsigned等方法,以支持unsigned long的算术运算。
对于“无限制”数值,您有类BigInteger
和BigDecimal
,但它们使用起来更昂贵,因此这需要一些时间来执行(perf vs precision是一种选择)< / p>
答案 1 :(得分:0)
为此,您实际上只需要查找两种变量类型的范围:http://www.cafeaulait.org/course/week2/02.html
为了保持简单:你在这里计算的值对于整数而言肯定是太长了,因为它从-2,147,483,648变为2,147,483,647,这可能会持续很长时间。