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

Cマガ電脳クラブ(第132回) 素数で割り切る素数の和

問題

5と71は、それぞれ自分未満の全素数の和を割り切ることができる素数である。
 2+3 = 5 = 5×1
 2+3+5+7+11+13+17+19+23+29+31+37+41+43+47+53+59+61+67 = 568 = 71×8
この条件を満たす素数を、5と71以外にもう1つ見つけてほしい。


ソース

using System;
using System.Collections.Generic;

class Program
{
    const int Jyougen = 370000;
    static int[] SosuuArr;

    //エラトステネスの篩で上限以下の素数の配列を作成
    static void Eratosthenes()
    {
        var IsSosuuArr = new System.Collections.BitArray(Jyougen + 1);
        for (int I = 2; I <= IsSosuuArr.Count - 1; I++) {
            IsSosuuArr[I] = true;
        }
        for (int I = 2; I * I <= IsSosuuArr.Count - 1; I++) {
            if (IsSosuuArr[I] == false) continue;
            for (int J = I * 2; J <= IsSosuuArr.Count - 1; J += I) {
                IsSosuuArr[J] = false;
            }
        }
        var SosuuList = new List<int>();
        for (int I = 2; I <= IsSosuuArr.Count - 1; I++) {
            if (IsSosuuArr[I]) SosuuList.Add(I);
        }
        SosuuArr = SosuuList.ToArray();
    }

    static void Main()
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();

        Eratosthenes();

        long SumVal = 0;
        for (int I = 0; I <= SosuuArr.GetUpperBound(0); I++) {
            if (I > 0 && SumVal % SosuuArr[I] == 0) {
                Console.WriteLine(SosuuArr[I]);
            }
            SumVal += SosuuArr[I];
        }
    }
}


実行結果

5
71
369119


解説

エラトステネスの篩で素数を列挙してから、
累積和が素数の倍数かをチェックしてます。