循环停止运行的Java问题

4

针对以下代码,当“n”大约到达10万时程序就会停止运行。我需要它一直运行到100万。我不知道哪里出错了,我还在学习Java,因此代码中可能存在简单的错误。

 public class Problem14{
public static void main(String[] args) {
    int chainLength;
    int longestChain = 0;
    int startingNumber = 0;
    for(int n =2; n<=1000000; n++)
    {
        chainLength = getChain(n);
        if(chainLength > longestChain)
        {
            System.out.println("chainLength: "+chainLength+" start: "+n);
            longestChain = chainLength;
            startingNumber = n;
        }
    }

    System.out.println("longest:"+longestChain +" "+"start:"+startingNumber);
}
public static int getChain(int y)
{
    int count = 0;
    while(y != 1)
    {
        if((y%2) == 0)
        {
            y = y/2;
        }
        else{
            y = (3*y) + 1;
        }
        count = count + 1;
    }

    return count;   
}
}

我只是好奇 - 一般来说,这段代码的目的是什么? - Caffeinated
1
你尝试过捕获异常来查看是否有未处理的异常被抛出吗?也许是堆栈溢出了? - Jonathan Henson
1
我正在做欧拉计划,这是一个需要解决数学问题的网站。 这是我正在做的问题:http://projecteuler.net/problem=14 - stackErr
你的程序是崩溃了还是停止输出了? - Daniel Haro
1
你确定它停止执行了吗?如果chainLength > longestChain不为真,则不会打印任何内容。也许你只是在等待的时间内没有找到更长的链条?尝试在该条件语句的else情况下打印一些东西(比如n的值)。 - Jon Newmuis
显示剩余2条评论
3个回答

6
请使用long作为数据类型而不是int
我想要强调的是,这个数字会飙升到超过1000000,所以变量y需要用long来存储它。

1
100万在32位整数范围之内,仍在努力找出问题所在! - Dan
1
对于 n? 1,000,000,它适合于 int 的范围内。 - Jon Newmuis
1
实际上他是对的,当应用get Chain方法时,数字确实会变得大于1000000。我只是从未意识到。在从int更改为long后,它可以正常工作。 - stackErr
4
如果@KumarVivekMitra解释了原因,也许人们就不会那么快就给他负面评分了,但正如我所说的,你做得很好 :)。 - stackErr
1
@KumarVivekMitra 在未来,你应该明确指出你所指的是什么。你没有说明哪个变量需要是长整型;就像其他人一样,我给你投了反对票,因为我认为你指的是 n。请注意,即使在你的编辑中,你仍未指定你所指的是哪个变量。 - Jon Newmuis
显示剩余7条评论

5

这是关于 y 的数据类型。它应该是 long,否则会绕回到负的20亿。

我认为我在这里做过 - 这是欧拉问题14。


1
是的,谢谢。不过 Kumar 已经先回答了 :),所以我会将他的回答标为正确。 - stackErr
你不需要这个函数 - 只需将while放在for循环内部即可。在执行链之前,将n复制到一个长变量中。其他可以清理的事情是使用运算符,例如y/=2而不是y=y/2和count++而不是count=count+1等等。 - Dan

1

getChain() 方法出现问题,它会变成负数,然后在循环中永远挂起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接