为什么使用long而不是int在for循环中给出了不同的答案(最长的Collat​​z序列)

时间:2017-09-07 06:48:01

标签: java int long-integer

我是java编程语言的新手。 为什么这段代码中有不同的输出?可以向我解释这个问题吗?非常感谢你。     公共阶层Collat​​z     {

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     公共阶层Collat​​z     {

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 可以告诉我是什么问题吗?谢谢。

2 个答案:

答案 0 :(得分:0)

因为您的值溢出int(可能是long)。

for (int i=2;i<1000000;i++){   
    real=i;
    int count=1;
    while(real>1)

您将循环很多时间,尤其是while循环

中的逻辑

由于你进行了乘法运算,因此该值会快速上升并达到最大值并开始回到最小值(“更大”的负值)并继续使用它。

intlong都有不同的最大值,因此溢出会在不同时刻发生,从而产生不同的结果。

您可以找到每种基本类型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的算术运算。

对于“无限制”数值,您有类BigIntegerBigDecimal,但它们使用起来更昂贵,因此这需要一些时间来执行(perf vs precision是一种选择)< / p>

答案 1 :(得分:0)

为此,您实际上只需要查找两种变量类型的范围:http://www.cafeaulait.org/course/week2/02.html

为了保持简单:你在这里计算的值对于整数而言肯定是太长了,因为它从-2,147,483,648变为2,147,483,647,这可能会持续很长时间。