2012-05-03 69 views
3
#include <stdlib.h> 
#include <stdio.h> 
int main(){ 
    int n, cont, fib, na = 0, nb = 1, sum_even = 0; 
    printf ("Insert a number and I'll tell you the respective Fibonacci: "); 
    scanf ("%d", &n); 
    for (cont = 1; cont < n; cont++) { 
     na += nb; 
     nb = na - nb; 
     fib = na + nb; 
     if (fib % 2 == 0) { 
     sum_even += fib; 
     } 
    } 
    printf ("%d\n", sum_even); 
    return 0; 
} 

我試圖做歐拉項目Problem 2,然後我想出了這個代碼。問題是:由於內存溢出,我無法找到斐波那契數列超過400或更近的數字的總和。因此,我不能解決這個問題,因爲它要求在斐波那契序列中找到低於4000000的對數之和。誰能幫我?我試圖使用浮點型數字來增加答案的容量,它似乎工作到一千年左右,但如果我嘗試使用更大的數字,我得到一個在15秒後在bash中的-nan錯誤的處理(我真的不知道它是什麼意思)。C中的內存溢出

#include <stdlib.h> 
#include <stdio.h> 
int main() { 
    int n, cont, div; 
    float sum_even = 0, na = 0, nb = 1, fib; 
    printf ("Insert a number and I'll tell you the respective Fibonacci: "); 
    scanf ("%d", &n); 
    for (cont = 1; cont <= n; cont++) { 
     na += nb; 
     nb = na - nb; 
     fib = na + nb; 
     div = fib/2; 
     if (div % 2 == 0) { 
     sum_even += fib; 
     } 
    } 
    printf ("%f\n", sum_even); 
    return 0; 
} 

回答

2

您誤解了問題陳述。任務是找到

{ fib(n) : fib(n) <= 4000000 && fib(n) % 2 == 0 } 

的總和,而不是

{ fib(n) : n <= 4000000 && fib(n) % 2 == 0 } 

這項任務是解決不與未成年修改代碼中的問題。取而代之的

for (cont = 1; cont < n; cont++) { 

使用

while(fib <= n) { 
+1

是的。我也在回答同樣的問題。但是也許需要很長的時間,然而int需要。 – Aslan986

+2

這裏不需要'fib(34)= 5702887> 4000000',所以總和很容易適合32位int。以後有很多問題需要64位整數。 –

+0

謝謝!現在我明白了我的錯誤。無論如何,我要看看這些長整數,雙倍和東西。我對編程還很陌生,所以我一點都不瞭解。 –

15

你所觀察到的不是內存溢出,而是數值溢出。練習的要點是要證明溢出確實發生,並讓你學會處理它的技巧。在這種特殊情況下,他們希望您實施arbitrary precision integer arithmetic,或者借用預先制定的實施方案並將其與您的解決方案一起使用。

+0

http://pastebin.com/91YHNJyT 我試圖用浮球式號碼increaase自己的能力,似乎工作到600左右,但如果我嘗試4000000,在15秒後,我在bash中得到了一個-nan錯誤。 (我真的不知道這意味着什麼)。 –

+1

這個想法是使用比「float」,「long long」,「double」甚至「uint128_t」更大的東西。你需要更多的數字,而不是128位。你可以嘗試[CLN](http://www.ginac.de/CLN/),或者實現你自己的加/減的非常長的整數編碼,例如,作爲它們的十進制數字的數組。 – dasblinkenlight