トップページに戻る    次の増井さんの書籍の問題へ    前の増井さんの書籍の問題へ

Q45 素数のマトリックス


C#のソース

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

class Program
{
    const int Kagen = 100;
    const int Jyougen = 999;
    static int[] SosuuArr = new int[Jyougen + 1];

    //エラトステネスの篩
    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 = Kagen; I <= Jyougen; I++) {
            if (IsSosuuArr[I]) SosuuList.Add(I);
        }
        SosuuArr = SosuuList.ToArray();
    }

    static void Main()
    {
        Eratosthenes();
        int UB = SosuuArr.GetUpperBound(0);

        int AnswerCnt = 0;
        for (int I = 0; I <= UB; I++) {
            for (int J = 0; J <= UB; J++) {
                for (int K = 0; K <= UB; K++) {
                    if (I == J) continue;
                    if (I == K) continue;
                    if (J == K) continue;

                    if (IsAnswer(SosuuArr[I], SosuuArr[J], SosuuArr[K]))
                        AnswerCnt++;
                }
            }
        }
        Console.WriteLine(AnswerCnt);
    }

    //3つの横の素数を引数とし、解かを判定
    static bool IsAnswer(int p1, int p2, int p3)
    {
        int[] NumArr1 = DeriveNumArr(p1);
        int[] NumArr2 = DeriveNumArr(p2);
        int[] NumArr3 = DeriveNumArr(p3);

        var NumSet = new HashSet<int>() { p1, p2, p3 };
        for (int I = 0; I <= NumArr1.GetUpperBound(0); I++) {
            int TateNum = NumArr1[I] * 100 + NumArr2[I] * 10 + NumArr3[I];
            if (NumSet.Add(TateNum) == false) return false;
            if (Array.BinarySearch(SosuuArr, TateNum) < 0) return false;
        }
        return true;
    }

    //数値を引数として、数字の配列を返す
    static int[] DeriveNumArr(int pTarget)
    {
        var WillReturn = new List<int>();

        int CopiedVal = pTarget;
        do {
            int ModVal = CopiedVal % 10;
            WillReturn.Add(ModVal);
            CopiedVal /= 10;
        } while (CopiedVal > 0);
        return WillReturn.ToArray();
    }
}


実行結果

29490


解説

エラトステネスの篩で3桁の素数を列挙し、
3桁の素数の順列に対して、解かを判定してます。