2012-05-03 74 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