トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem25 フィボナッチ数列で1000桁になる最初の項番号

問題

フィボナッチ数列は以下の漸化式で定義される

Fn = Fn-1 + Fn-2, ただし F1=1 , F2=1
最初の12項は以下である.

F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
F7 = 13
F8 = 21
F9 = 34
F10 = 55
F11 = 89
F12 = 144
12番目の項, F12が3桁になる最初の項である.

1000桁になる最初の項番号を答えよ


ソース

using System;

class Program
{
    //const int TargetKeta = 3;
    const int TargetKeta = 1000;

    static void Main()
    {
        int[,] IntArr = new int[4800, TargetKeta * 2];
        IntArr[2, 0] = IntArr[1, 0] = 1;

        for (int N = 3; N <= IntArr.GetUpperBound(0); N++) {
            for (int I = 0; I <= IntArr.GetUpperBound(1); I++) {
                IntArr[N, I] = IntArr[N - 2, I] + IntArr[N - 1, I];
            }
            for (int I = 0; I <= IntArr.GetUpperBound(1); I++) {
                if (IntArr[N, I] >= 10) {
                    IntArr[N, I + 1] += IntArr[N, I] / 10;
                    IntArr[N, I] %= 10;
                }
            }
            var sb = new System.Text.StringBuilder();
            bool IsHit = false;
            for (int Y = IntArr.GetUpperBound(1); Y >= 0; Y--) {
                if (IsHit == false && IntArr[N, Y] > 0) {
                    IsHit = true;
                }
                if (IsHit) sb.Append(IntArr[N, Y]);
            }
            Console.WriteLine("{0}番目の値は{1}桁({2})", N, sb.Length, sb.ToString());
            if (sb.Length >= TargetKeta) return;
        }
    }
}


実行結果

省略
4782番目の値は1000桁(10700662663827589367649805844573968850836838966321516650132
35203375314520604694040621889147582489792657804694888177591957484336466672569959
51299603046126274809248218614406943305123477444275027378175308757939166619214925
91867595539664228371489431130746995034395470019854326097230672901928705264472437
26117715821825548491120525013201478612965931381792235559657452039506137551467837
54322911960212993404826070617539770684706820289548690266618543512452190036948064
13574474709117076197669456910700980243934396174741037369125032313655321647736970
23167755051595173518460579954919410967778373229665796581646513903488154256310184
22419025984608800011018625555024549393711365165703944762958471454852342595042858
24253060835444354282126110089928637950480068943303097732178348645431132057656598
68456288616808718693835297350643986297640660000723562917905207051164077614812491
88583094594056668833910935094445657635766615161931775379289166158132715961687748
7983821820492520348473874384736771934512787029218636250627816)


解説

Intの配列で大きい桁の変数を代用してます。