2011-05-16 102 views
1

我是一個相對較新的java程序員,我一直在修改這個程序的一天中的更好的一部分,我仍然卡住;我希望你能幫助我。項目歐拉,問題2 - Java

所以程序應該滿足以下要求:

在Fibonacci序列 每個新學期是通過添加 前兩個方面產生。通過用1和 2開始時,第一10項將是:

1,2,3,5,8,13,21,34,55,89,...

通過考慮術語在 斐波那契數列的值不是 超過四百萬,求出偶數值的總和 。

這是我的代碼:

//Generates Fibonacci sequence 
    while (fibNum < 144) 
    { 
     int lastValue = (Integer) fibList.get(fibList.size()-1); 
     int secondToLastValue = (Integer) fibList.get(fibList.size()-2); 

     fibNum = secondToLastValue + lastValue; 

     if (fibNum < 144) 
     { 
      fibList.add(fibNum); 
     } 

    //Picks out the even numbers from limitFibList 
    for (int i = 0; i < fibList.size(); i++) 
    { 
     if ((Integer) fibList.get(i) % 2 == 0) 
     { 
      evenNumsFibList.add(fibList.get(i)); 
     } 
    } 

    //Sums up the total value of the numbers in the evenNumsFibList 
    for (int i = 0; i < evenNumsFibList.size(); i++) 
    { 
     sum += (Integer) evenNumsFibList.get(i); 
    } 

...這是我得到的輸出:

Fibonacci sequence list: [1, 2, 3] 
Size of the Fibonacci list: 3 
Even Numbers list: [2] 
Total sum of even numbers: 2 

Fibonacci sequence list: [1, 2, 3, 5] 
Size of the Fibonacci list: 4 
Even Numbers list: [2, 2] 
Total sum of even numbers: 6 

Fibonacci sequence list: [1, 2, 3, 5, 8] 
Size of the Fibonacci list: 5 
Even Numbers list: [2, 2, 2, 8] 
Total sum of even numbers: 20 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13] 
Size of the Fibonacci list: 6 
Even Numbers list: [2, 2, 2, 8, 2, 8] 
Total sum of even numbers: 44 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21] 
Size of the Fibonacci list: 7 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8] 
Total sum of even numbers: 78 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21, 34] 
Size of the Fibonacci list: 8 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8, 2, 8, 34] 
Total sum of even numbers: 156 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21, 34, 55] 
Size of the Fibonacci list: 9 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8, 2, 8, 34, 2, 8, 34] 
Total sum of even numbers: 278 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 
Size of the Fibonacci list: 10 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8, 2, 8, 34, 2, 8, 34, 2, 8, 34] 
Total sum of even numbers: 444 

Fibonacci sequence list: [1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 
Size of the Fibonacci list: 10 
Even Numbers list: [2, 2, 2, 8, 2, 8, 2, 8, 2, 8, 34, 2, 8, 34, 2, 8, 34, 2, 8, 34] 
Total sum of even numbers: 654 

顯然,我的while循環有助於我的問題,但我不知道如何解決它。

將非常感謝您的幫助,

哈克

回答

5

看起來你缺少的while循環結束括號。所以其他的for都在其中運行。

所以:

while (fibNum < 144) 
    { 
     int lastValue = (Integer) fibList.get(fibList.size()-1); 
     int secondToLastValue = (Integer) fibList.get(fibList.size()-2); 

     fibNum = secondToLastValue + lastValue; 

     if (fibNum < 144) 
     { 
      fibList.add(fibNum); 
     } 
    } 

    //Picks out the even numbers from limitFibList 
    for (int i = 0; i < fibList.size(); i++) 
    {... 
+0

這是大括號。謝謝,非常感謝你的幫助 – LTH 2011-05-16 01:17:41

0

的問題是在這裏:

for (int i = 0; i < fibList.size(); i++) 
{ 
    if ((Integer) fibList.get(i) % 2 == 0) 
    { 
     evenNumsFibList.add(fibList.get(i)); <-- HERE 
    } 
} 

你adppending所有的偶數的一個全新的列表,你已經擁有了列表的末尾。

在再次調用此循環之前,您需要刪除evenNumsFibList中的所有內容,或者修改循環以僅添加不在列表中的偶數。

這是假設您的縮進不正確。如果你的縮進實際上是你想要的,那麼你只是在你的while循環中丟失了一個右括號。

+0

良好的接觸..縮進愚弄我。 – bdares 2011-05-16 00:42:51

+0

感謝您的快速回復,並抓住缺失的支架。大聲笑有時候,最小的東西可能會讓你失望。 – LTH 2011-05-16 01:18:26

0

我錯過了什麼嗎?你爲什麼需要創建列表?你只需要一個偶數數值的總和?對?如果我正確理解了你的話,你可以在10行代碼中得到你的總和......我沒有Java IDE opend,所以我會給你Pythone代碼。如果這是你所需要的,我會把它轉換成Java。

def fib(n=4000001): # write Fibonacci series up to n 
    r = 0 
    a, b = 0, 1 
    while b < n: 
     if not b%2 : 
      print(b, end=' ') 
      r += b 
     a, b = b, a+b 
    return r 

OUTPUT: 
2 8 34 144 610 2584 10946 46368 196418 832040 3524578 
sum = 4613732 
+0

現在我明白了 - 這是歐拉計劃,我錯過了那部分... – Nikiton 2011-05-16 19:48:09

8

如果你把在Fibonacci序列中,你實際上需要的(只有甚至是那些需要進行求和)數字仔細看看,你會看到一個模式:

0 1 1 2 3 5 8 13 21 34 55 89 144 ... 
- O O E O O E O O E O O E 

注意在0之後開始的每個第三個數字是偶數。因此,如果您計算每第三個斐波納契數,您可以消除對均勻度的任何檢查。在序列再次看,你可以看到,如果k是你正在尋找本甚至斐波那契數和j是一個上一個,下一個偶數Fibonacci數n獲得人:

n = 4k + j 

所以在Java中,你可以嘗試這樣的事:

int j = 0; 
int k = 2; 
int sum = j+k; 

while (k < LIMIT) { 
    int tmp = 4*k + j; 
    sum = sum + tmp; 
    j = k; 
    k = tmp; 
} 
+0

真棒解決方案。我喜歡這些珠寶。 – KyleWpppd 2011-05-16 04:36:27

+0

真的很好,簡潔的解決方案!但是如何找到變量LIMIT的值?我們必須找到Fibonacci序列中所有偶數的總和,其值不超過四百萬。請,我請你解釋一下邏輯。我希望它與上述一樣簡潔。 – 2013-01-31 13:54:26

+0

@AshutoshDave'LIMIT'是一個用戶定義的常量。假設這個常量被定義並設置爲你需要的任何值。鑑於這些值不超過4M,那麼'LIMIT'就會成爲'int'。 – buruzaemon 2013-01-31 23:42:32

0

公共類Euler002 {

int counter = 0; 

public int getCounter() { 
    return counter; 
} 

public int getFibTotal() { 
    final int UPPER_LIMIT = 4000000; 
    int fib1 = 0; 
    int fib2 = 1; 
    int newFib = fib1 + fib2; 
    int total = 0; 

    while (newFib < UPPER_LIMIT) { 
     counter++; 
     fib1 = fib2; 
     fib2 = newFib; 
     newFib = fib1 + fib2; 
     if ((newFib % 2) == 0) { 
      total += newFib; 
     } 
    } 
    return total; 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    Euler002 euler002 = new Euler002(); 
    int total = euler002.getFibTotal(); 
    System.out.println(" Counter = " + euler002.getCounter() + " And Fib Total is " + total); 
} 

}