2013年4月29日月曜日

C# で Project Euler に挑戦: Problem 2

問題

偶数のフィボナッチ数

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

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

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

ぼくの解答

static void Main(string[] args)
{
    int n = 4000000;
    var answer = FibonacciNumbers(n - 1)
        .Where(i => i%2 == 0)
        .Sum();

    Console.WriteLine(answer);
    Console.ReadLine();
}

static IEnumerable<int> FibonacciNumbers(int max)
{
    foreach (var i in FibonacciNumbers())
    {
        if (max < i)
            yield break;

        yield return i;
    }
} 

static IEnumerable<int> FibonacciNumbers()
{
    var previous = 0;
    var current = 1;
    var next = 0;

    while (true)
    {
        next = previous + current;
        yield return next;

        previous = current;
        current = next;
    }
}

解説

問題を解くだけならもっとシンプルになるんですが、LINQっぽく(?)処理しようと思いました。

フィボナッチ数の無限シーケンスを返すメソッドを作って、最大値でブレークするオーバロードを用意。これで Where, Sum メソッドで簡単に処理できます。

0 件のコメント:

コメントを投稿

TFT 10.14 Peeba Comp

こちらのガイドの自分用まとめです。 https://www.reddit.com/r/CompetitiveTFT/comments/hraunp/tft_1014_break_the_meta_new_peeba_comp_set_35/ 難しいですが完成すると非常に強く、プレ...