トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Problem49 素数の等差数列
問題
項差3330の等差数列1487, 4817, 8147は次の2つの変わった性質を持つ.
・3つの項はそれぞれ素数である.
・各項は他の項の置換で表される.
1,2,3桁の素数にはこのような性質を持った数列は存在しないが,
4桁の増加列には、もう1つ存在する.
それではこの数列の3つの項を連結した12桁の数を求めよ.
ソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
const int Jyougen = 9999;
static int[] mSosuuArr = new int[Jyougen + 1];
//エラトステネスの篩
static void Eratosthenes()
{
for (int I = 2; I <= mSosuuArr.GetUpperBound(0); I++) {
mSosuuArr[I] = I;
}
for (int I = 2; I * I <= mSosuuArr.GetUpperBound(0); I++) {
if (I != 2 && I % 2 == 0) continue;
if (mSosuuArr[I] != 0) {
for (int J = I * 2; J <= mSosuuArr.GetUpperBound(0); J += I) {
mSosuuArr[J] = 0;
}
}
}
mSosuuArr = mSosuuArr.Where(X => X != 0).Where(X => 1000 <= X).ToArray();
}
static void Main()
{
Eratosthenes();
var Stk = new Stack<List<int>>();
for (int I = 0; I <= mSosuuArr.GetUpperBound(0); I++) {
if (mSosuuArr[I] == 1487) continue;
Stk.Push(new List<int>() { mSosuuArr[I] });
}
while (Stk.Count > 0) {
List<int> PoppedList = Stk.Pop();
if (PoppedList.Count == 3) {
Console.Write("Answer=");
PoppedList.ForEach(A => Console.Write(A));
Console.WriteLine();
continue;
}
int LastVal = PoppedList[PoppedList.Count - 1];
foreach (int EachSosuu in mSosuuArr.Where(X => LastVal < X)) {
//条件1 3項目が9999を超えないこと
if (PoppedList.Count == 1) {
int Kousa1 = EachSosuu - LastVal;
if (EachSosuu + Kousa1 > Jyougen) break;
}
//条件2 等差数列であること
if (PoppedList.Count == 2) {
int Kousa2 = PoppedList[1] - PoppedList[0];
if (PoppedList[1] + Kousa2 < EachSosuu) break;
if (PoppedList[1] + Kousa2 > EachSosuu) continue;
}
//条件3 数字が一致すること
var HashSet1 = new HashSet<char>(LastVal.ToString());
var HashSet2 = new HashSet<char>(EachSosuu.ToString());
if (HashSet1.SetEquals(HashSet2) == false) continue;
var WillPushList = new List<int>(PoppedList);
WillPushList.Add(EachSosuu);
Stk.Push(WillPushList);
}
}
}
}
実行結果
Answer=296962999629
解説
エラトステネスの篩で4桁の素数を列挙してから、
昇順で深さ優先探索してます。