2015-10-16 11 views
0

我想完成項目euler網站上的問題25,但是我收到Java堆空間錯誤。我該如何解決這個問題?項目euler#25代碼堆空間錯誤

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++; 
     } 
    } 
} 
+0

下,你認爲什麼條件你for循環會終止? – azurefrog

+0

似乎你的'for-loop'永遠不會停止。你需要一個條件。'for(int i = 2; condition; i ++)' – dguay

回答

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

你錯過了一個條件時,環路將break.All你正在做的是增加整體和循環繼續forever.In一段時間,ArrayList變得太大,拋出一個Java堆空間錯誤

0

這個程序是從解決Euler #25很遠的地方:

  • 循環不計算斐波那契序列
  • 循環將永遠不會退出:在for(int i = 2; ;i++)循環條件失蹤,沒有什麼在循環體退出循環
  • 數字的ArrayList<Integer>長度將永遠無法達到1000:最大可能Integer是2147483647,其長度爲10
    • 作爲一個方面說明,一個List是不必要的解決這個問題
    • 在發佈代碼,你可以取代nums.get(i)Integer.toString(c),並刪除涉及nums得到相同的結果的所有語句。 (這一切都不重要,但因爲上述第一點的)

一些技巧來解決這個問題:

  • 使用BigInteger產生Fibonacci序列
    • 這很容易找到使用int的示例實現。與BigInteger
  • 更換int使用簡單int櫃檯找到索引