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

私はプロジェクトオイラー問題2を実行しようとしていたので、このコードを思いつきました。問題は次のとおりです。メモリがオーバーフローしたため、400を超える数またはそれに近い数のフィボナッチ数列のペア数の合計が見つかりません。結果として、フィボナッチ数列で4000000未満のペア数の合計を求めるように求められるため、この演習を解くことはできません。誰か助けてもらえますか?

編集:答えの容量を増やすためにfloatタイプの数値を使用しようとしましたが、1000程度までは機能するようですが、それよりも大きい数値を使用すると、15秒の処理後にbashで-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 に答える