にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

Problem 2

フィボナッチ数列の項は前の2つの項の和である。 最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。

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

数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。

Problem 2 - PukiWiki

最初、「項(の値)が400万」であるところを「項数400万」と誤読したせいで大変なことになりました。
再帰を使ってフィボナッチ数列の項を求めようとしたら、スタックオーバーフローの嵐。
無駄なことはやめて1から順番に見ていきました。

#include <stdio.h>

#define TERM_MAX 4000000

void problem002()
{
    int ans, val, a, b;

    /* solve this problem here */
    ans = 0;
    val = 0;
    a = 1;
    b = 2; ans += b;
    while (val <= TERM_MAX) {
        if ((val % 2) == 0) {
            ans += val;
        }
        val = a + b;
        a = b;
        b = val;
    } 

    printf("%s: answer = %d\n", __FUNCTION__, ans);
}

int main(int argc, char* argv[]) 
{
    problem002();
    return 0;
}

実行結果

$ ./problem002
problem002: answer = 4613732