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;
}

我试图做 Project Euler Problem 2,然后我想出了这段代码。问题是:我在斐波那契数列上找不到超过 400 或接近数字的数字对的总和,因为内存溢出。结果,我无法解决这个练习,因为它要求在斐波那契数列中找到低于 4000000 的对数之和。谁能帮我?

编辑:我尝试使用浮点类型数字来增加答案的容量,它似乎可以工作到一千左右,但是如果我尝试使用更大的数字,我会在 bash 处理 15 秒后出现 -nan 错误(我没有'不知道这意味着什么)。

#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;
}
4

2 回答 2

15

您观察到的不是内存溢出,而是数字溢出。练习的重点是表明溢出确实会发生,并让你学习处理它的技巧。在这种特殊情况下,他们希望您实现任意精度整数算术,或者借用预制实现并将其与您的解决方案一起使用。

于 2012-05-03T19:18:54.930 回答
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) {
于 2012-05-03T19:58:49.933 回答