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

Problem35 100万未満の巡回素数は何個か?

問題

197は巡回素数と呼ばれる. 桁を回転させたときに得られる数 197, 971, 719 が全て素数だからである.

100未満には巡回素数が13個ある: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, および97である.
100万未満の巡回素数は何個か?


ソース

using System;
using System.Linq;

class Program
{
    //const int SikiiVal = 100;
    const int SikiiVal = 1000000;

    static int[] SosuuArr = new int[SikiiVal];

    //エラトステネスの篩
    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;
                }
            }
        }
    }

    static void Main()
    {
        Eratosthenes();

        SosuuArr = SosuuArr.Where(X => X != 0).ToArray();

        int Cnt = 0;
        foreach (int EachSosuu in SosuuArr) {
            bool WillOut = true;
            char[] wkCharArr = EachSosuu.ToString().ToCharArray();
            for (int I = 0; I <= wkCharArr.GetUpperBound(0); I++) {
                string WillCastInt = "";
                for (int J = 0; J <= wkCharArr.GetUpperBound(0); J++) {
                    int wkP = I + J;
                    if (wkP > wkCharArr.GetUpperBound(0)) wkP -= wkCharArr.GetUpperBound(0) + 1;
                    WillCastInt += wkCharArr[wkP];
                }
                if (Array.BinarySearch<int>(SosuuArr, int.Parse(WillCastInt)) < 0) {
                    WillOut = false;
                    break;
                }
            }
            if (WillOut) Console.WriteLine("{0}は{1}番目の巡回素数", EachSosuu, ++Cnt);
        }
    }
}


実行結果

省略
933199は51番目の巡回素数
939193は52番目の巡回素数
939391は53番目の巡回素数
993319は54番目の巡回素数
999331は55番目の巡回素数


解説

2ではなく2を含んでいたら除外する。
5ではなく5を含んでいたら除外する。
といったフィルタをLINQのWhere拡張メソッドで行ってもいいかもしれません。