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

遊び倒すガイド 初級編 100万以下の素数番目の素数の総和

問題

よく知られているように、
2は1番目の素数であり、
3は2番目、
5は3番目、
7は4番目の素数である。

n番目の素数pに対し、nもまた素数である場合に、pを「素数番目の素数」と呼ぶことにしよう。
3と5は素数番目の素数だが、2と7はそうではない。
100万以下の素数番目の素数の総和を求めよ。

プロジェクトオイラーを遊び倒すガイド (初級編)


ソース

using System;
using System.Linq;

class Program
{
    const int Jyougen = 1000000;

    static int[] SosuuArr = new int[Jyougen + 1];

    //エラトステネスの篩
    static void Eratosthenes()
    {
        for (int I = 2; I <= SosuuArr.GetUpperBound(0); I++) {
            SosuuArr[I] = I;
        }
        for (int I = 2; I * I <= SosuuArr.GetUpperBound(0); I++) {
            if (I != 2 && I % 2 == 0) continue;

            if (SosuuArr[I] != 0) {
                for (int J = I * 2; J <= SosuuArr.GetUpperBound(0); J += I) {
                    SosuuArr[J] = 0;
                }
            }
        }
        SosuuArr = SosuuArr.Where(X => X != 0).ToArray();
    }

    static void Main()
    {
        Eratosthenes();
        long SumVal = 0;
        for (int I = 0; I <= SosuuArr.GetUpperBound(0); I++) {
            if (Array.BinarySearch(SosuuArr, I + 1) >= 0)
                SumVal += SosuuArr[I];
        }
        Console.WriteLine("Answer={0}", SumVal);
    }
}


実行結果

Answer=3475059124


解説

100万以下の素数は、7万件あるので、Array.BinarySearchを使ってます。
ジェネリック版のArray.BinarySearchを明示的に使ってもいいでしょう。
MSDN --- Array.BinarySearch