2012-01-19 92 views
5

我試圖解決Euler's Project #2,我一直以「Infinity」或「NaN」(不是數字)的方式得到答案。我嘗試將數字類型更改爲int(最初爲Double),但這並沒有解決任何問題給我的回答「-1833689714」項目歐拉#2無限?

public class Pro { 
    static int g = 1; 
    static int n, f = 0; 
    public static void main(String args[]) { 
     for (int i = 0; i <= 4000000; i++) { 
      f = f + g; 
      g = f - g; 
      if (f % 2 == 0) { 
       n += f; 
      } 
     } 
     System.out.println("Answer: " + n); 
    } 
} 

的問題是:

在Fibonacci序列中的每個新名詞是通過將前兩個方面產生。通過用1和2開始,第一10項將是:

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

通過考慮中的條款斐波納契數列的值不超過四百萬,找到偶數項的和。

+0

你也可能要檢查BigInteger類:http://docs.oracle.com/javase/6/docs/ api/java/math/BigInteger.html – santiagozky

回答

8

你正在考慮斐波那契序列而不是第一x條款不超過4,000,000第4000000項。

+0

謝謝,我還在醒來;)現在明白了 – M4trixSh4d0w

2

您可能遇到溢出。 fibo(4000000)遠高於MAX_INT

注:,你不會被要求找到總和4,000,000第一號連號,但要找到的元素,他們的不超過4,000,000的總和。

您應該檢查是否f< 4000000如果沒有,打破,而不是等待i達到400萬

1

您正在檢查第一個400萬斐波納契,您只需檢查術語,直到fibonnaci術語大於400萬,然後停止。你得到負數的原因是,你最終得到的是大於Integer.MAX_INT的斐波那契條款,在這一點你溢出,並開始獲得負數,你正在增加你的總數。如果你不肯定最終答案是否會超過Integer.MAX_INT,那麼你應該使用長整型作爲累加器而不是整型。

0

使用GMP來處理C中的大數字。 之前的一點思考也不會傷害(例如,奇數與偶數的頻率是多少,斐波那契數列的前n個元素的總和是多少) ...

+1

這不是'C',java有它的原生'BigInteger'類。另外,對於這個問題,「長」已經足夠了。 – amit

+0

我對C部分的不好... – Matthieu

+0

使用'long'可能綽綽有餘,但'BigInteger'是高精度計算的首選:http://docs.oracle.com/javase/tutorial/java/data /numberclasses.html –

3

您的問題是整數溢出:在Java中,int變量僅限於Integer.MAX_VALUE(2147483647)。如果在計算中超過此值,則會溢出至Integer.MIN_VALUE,最小值爲,負值爲。請參閱:

public class IntegerOverflow { 
    public static void main(String[] args) { 
     int i = Integer.MAX_VALUE; 
     System.out.println("i = Integer.MAX_VALUE: " + i); 
     System.out.println("i + 1: " + (i + 1)); 
     System.out.println("i + 2: " + (i + 2)); 
    } 
} 

要避免溢出問題,與任意精度的整數執行你的計算,由java.math.BigInteger類提供:

import java.math.BigInteger; 

public class BigIntegerExample { 
    public static void main(String[] args) { 
     BigInteger b = BigInteger.valueOf(Long.MAX_VALUE); 
     System.out.println("b = Long.MAX_VALUE: " + b); 
     System.out.println("b**2: " + b.multiply(b)); 
     System.out.println("b**3: " + b.pow(3)); 
     System.out.println("b**10: " + b.pow(10)); 
    } 
} 

注意:當你沒有問爲了解決問題本身,我只是回答這個問題。希望這可以幫助

+1

這個問題應該只需要一個'int'。 – Jeffrey

+0

你是對的,但是:在這個問題中使用'BigInteger'的性能損失可以忽略不計,並且使用'BigInteger'你不必擔心溢出。 –

+0

+1用於回答與筆記的問題,並保持PE幫助的精神。 –

0

您可以使用long而不是int

每第三個表達式都是偶數,所以您只需要評估每個第三個值。這個速度稍微快一些,因爲它循環次數少,你不必測試偶數/奇數。

您只需要n而不是i這是不到400萬。

0

這是我得到了答案:

def fib(): 
     x,y = 0,1 
     while True: 
      yield x 
      x,y = y, x+y 

def even(seq): 
    for number in seq: 
     if not number % 2: 
      yield number 

def under_a_million(seq): 
    for number in seq: 
     if number > 4000000: 
      break 
     yield number 

print sum(even(under_a_million(fib()))) 

-M1K3