4

これはプロジェクトオイラーの問題です。候補となるソリューションを見たくない場合は、ここを見ないでください。

みなさん、こんにちは!私は、フィボナッチ数列のすべての偶数項の合計を見つけるアプリケーションを開発しています。このシーケンスの最後の項は4,000,000です。私のコードに何か問題がありますが、それは私にとって理にかなっているので、私は問題を見つけることができません。手伝ってくれませんか?

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
           long[] arr = new long [1000000] ;
           long i= 2;
           arr[i-2]=1;
           arr[i-1]=2;
           long n= arr[i];

           long s=0;
            for (i=2 ; n <= 4000000; i++)
            {                    
                arr[i] = arr[(i - 1)] + arr[(i - 2)];
            }
            for (long f = 0; f <= arr.Length - 1; f++)
            {
                if (arr[f] % 2 == 0)
                    s += arr[f];
            }
            Console.Write(s);
            Console.Read();                
        }
    }
}
4

5 に答える 5

3

これを使用してください:http://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression

3番目のアイデンティティこのアイデンティティは、jが奇数か偶数かによって、Fjの形式がわずかに異なります。jが奇数であるような最初のn− 1フィボナッチ数の合計Fjは、(2n)番目のフィボナッチ数です。

jが偶数であるような最初のn個のフィボナッチ数の合計Fjは、(2n + 1)番目のフィボナッチ数から1を引いたものです。

[16]

唯一の問題は、ファイを(2n + 1)乗すると精度が低下する可能性があることです。

于 2010-04-04T14:37:03.670 に答える
2

このセクションで:

       long n= arr[i];

       long s=0;
        for (i=2 ; n <= 4000000; i++)
        {

            arr[i] = arr[(i - 1)] + arr[(i - 2)];
        }

割り当てnたのは1回だけです。n更新されないため、ループが終了することはありません。

nにバインドされていませんi; その時点で2だったのでにn設定されます。したがって、ループの最初の反復から永久に3になります。arr[2]ii

これを修正するための1つのアプローチは、完全に取り除きn、ループ条件を作成することです。

for (i = 2; arr[i] <= 4000000; i++)
于 2010-04-04T14:08:29.987 に答える
1

for最初のループを次のように変更します。

for (i = 2; arr[i - 1] < 4000000; i++)
于 2010-04-04T14:43:57.707 に答える
1

これを試してください(そしてこれを大きな整数の要件に使用してください:http://intx.codeplex.com/Wikipage):

using System;
using System.Collections;
using System.Linq;
using System.Collections.Generic;

using Oyster.Math;

namespace Application
{


public class Test
{

    public static void Main()
    {    
        IntX even = 0;
        Console.WriteLine("Sum of even fibonacci {0}\n", 
            Fibonacci(20).Where(x => x % 2 == 0).Sum());
        Console.WriteLine("Sum of odd fibonacci {0}", 
            Fibonacci(20).Where(x => x % 2 == 1).Sum());

        Console.Write("\nFibonacci samples");
        foreach (IntX i in Fibonacci(20))
            Console.Write(" {0}", i);

        Console.ReadLine();

    }

    public static IEnumerable<IntX> Fibonacci(int range)
    {
        int i = 0;

        IntX very = 0;       
        yield return very;
        ++i;

        IntX old = 1;       
        yield return old;
        ++i;

        IntX fib = 0; 
        while (i < range)
        {
            fib = very + old;
            yield return fib;
            ++i;

            very = old;
            old = fib;                
        }

    }
}


public static class Helper
{
    public static IntX Sum(this IEnumerable<IntX> v)
    {
        int s = 0;
        foreach (int i in v) s += i;
        return s;
    }
}

}

サンプル出力:

Sum of even fibonacci 3382

Sum of odd fibonacci 7563

Fibonacci samples 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
于 2010-04-04T16:06:15.557 に答える
1

私はこれをまったく異なる方法で行うことを認めます。おそらく、リュカ数とフィボナッチ数のペアのシーケンスに加えて、簡単な式を使用します

F(n + a)=(F(a)* L(n)+ L(a)* F(n))/ 2

L(n + a)=(5 * F(a)* F(n)+ L(a)* L(n))/ 2

3つおきのフィボナッチ数だけが偶数であることに注意してください。したがって、F(3)= 2、L(3)= 4なので、次のようになります。

F(n + 3)= L(n)+ 2 * F(n)

L(n + 3)= 5 * F(n)+ 2 * L(n)

次に、用語を合計します。

(編集:これにはさらに簡単な解決策があります。これは、数学的に洗練されたものを導き出すか、フィボナッチ数列とその数列のIDに関する知識、または整数列の百科事典を検索することに依存しています。悲しいことに、これ以上このヒントはPEの問題には不適切と思われるので、このメモの余白にその解決策を残します。したがって、最初のk個のフィボナッチ数の合計は...)

于 2010-04-08T01:31:40.320 に答える