トップページに戻る
次の増井さんの書籍の問題へ
前の増井さんの書籍の問題へ
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桁の素数の順列に対して、解かを判定してます。