2013-03-08 54 views
1

我對項目歐拉的第二個問題的最短解決方案感興趣:甚至Java中的斐波那契數。項目歐拉即使斐波納契

Fibonacci序列中的每個新項都是通過添加前兩項生成的。從1和2開始,前10項將是: 1,2,3,5,8,13,21,34,55,89,... 通過考慮Fibonacci序列中的值,其值不超過四百萬,找到偶數項的總數 。

我在看什麼:

public class fibonnaci { 
    public static void main(String[] args) { 
    int f=0,t=0,n=0,s=1; 
    for(;n<4000000;n=f+s){ 
     f=s;s=n; 
     if(n%2==0)t+=n; 
    } 
    System.out.println(t); 
    } 
} 

我添加空格以提高可讀性。

我該如何縮短(或者正確的情況下)?

+5

*「我怎樣才能讓這個短」 *良好的代碼是沒有這麼多使用內存和CPU週期2)可擴展與其他程序員維護的「短」爲1)高效。這可能是一種'計算機語言',但其中的大部分都是爲了人類的眼睛。因此,「明白易懂」比「最低字數」要好。 – 2013-03-08 04:26:44

+0

更短:你不需要'&& n GoZoner 2013-03-08 04:28:01

+3

爲了擴展Andrew的說法,更多的描述性變量名稱肯定會成爲優點。 – 2013-03-08 04:30:12

回答

1

對此的最佳解決方案可能是創建一個Fibonnaci數字的數組。用計數器創建一個循環。至少迭代,計算下一個數字並將其推送到數組上。請記住,由於F(n)= F(n-1)+ F(n-2),並且已經有F(n-1),F(n-2)計算並保存,簡單的加法。如果此數字超出您的限制,請退出循環。

現在遍歷數組添加每個其他數字(這將是偶數)。

這可能是您最有效的使用CPU。

更新:正如C. Lang(間接地)指出的那樣,您可以在計算時保持總和以避免在最後遍歷列表。

+1

我想他只是想打印它們。爲什麼要保存那些你不需要的東西?如果需要迭代和打印它不是最好的? – ChiefTwoPencils 2013-03-08 04:42:17

+0

因爲通過保存它們,他不需要在找到F(n + 1),F(n + 2)等等時遞歸地重新計算它們。 - http://en.wikipedia.org/wiki/Dynamic_programming – 2013-03-08 04:45:49

+0

The你的鏈接中的fib示例正在拉第n個fib。相對於提供的示例,我的觀點是,您仍然必須計算數字才能存儲它們。毫無疑問,存儲數據會產生額外的成本,其中一半不需要,然後再次遍歷數組以打印數據。 – ChiefTwoPencils 2013-03-08 05:00:20

0

如果您認爲public static void main(String[]a) {System.out.println(4613732);}作弊,那麼如何不奇怪奇數值?

public static void main(String[] args) { 
    int f,s,t=s=2,n=8; 
    for(;n<4000000;t+=n,f=s,s=n,n=f+4*s); 
    System.out.println(t); 
}