Project euler#25代码堆空间错误

时间:2015-10-16 17:03:48

标签: java

我正在尝试在项目euler网站上完成问题25,但我收到了Java堆空间错误。我该如何解决这个问题?

import java.util.ArrayList;
public class Problem25 {
    public static void main(String[] args){
        int a = 1;
        int b = 1;
        int c;
        ArrayList<Integer> nums = new ArrayList<Integer>();
        nums.add(1);
        nums.add(1);
        for(int i = 2; ;i++){
            c = a+b;
            nums.add(c);
            if(nums.get(i).toString().length() == 1000)
                System.out.print(nums.get(i));
            a++;
            b++;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

for(int i = 2; ;i++){

当循环中断时你错过了一个条件。你正在做的是添加整数并且循环继续。在某个时候,ArrayList变得太大并抛出Java堆空间错误

答案 1 :(得分:0)

这个程序离解决Euler #25非常远:

  • 循环不计算Fibonacci序列
  • 循环永远不会退出:for(int i = 2; ;i++)中缺少循环条件,循环体中没有任何东西可以退出循环
  • ArrayList<Integer>中的数字长度永远不会达到1000:最大可能Integer为2147483647,长度为10
    • 作为旁注,List无需解决此问题
    • 在发布的代码中,您可以将nums.get(i)替换为Integer.toString(c),并删除涉及nums的所有语句,以获得相同的结果。 (但这些都不重要,因为上面的第一点)

解决此问题的一些提示:

  • 使用BigInteger生成斐波纳契数列
    • 使用int很容易找到示例实现。将int替换为BigInteger
  • 使用简单的int计数器查找索引