トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Cマガ電脳クラブ(第122回) 3型素組数
問題
619737131179
この数は、なかからどの並んだ2桁の数をとっても素数になっており、しかもすべて異なっている。
このような数を2型素組数と呼ぶことにする。実はこの数は最大の2型素組数である。
では,3型素組数 (並んだ3桁のどれもが相異なる素数となっている数) の最大を見つけてほしい。
また、その最大値と同じ桁数には何個の3型素組数があるだろうか。
ソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
const int Jyougen = 999;
static string[] SosuuStrArr;
//エラトステネスの篩
static void Eratosthenes(int pKetasuu)
{
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);
}
var wkList = SosuuList.ConvertAll(X => X.ToString());
wkList.RemoveAll(X => X.Length > pKetasuu);
SosuuStrArr = wkList.Select(X => X.PadLeft(pKetasuu, '0')).ToArray();
}
static void Main()
{
var sw = System.Diagnostics.Stopwatch.StartNew();
Solve(2);
Solve(3);
Console.WriteLine("経過時間={0}", sw.Elapsed);
}
struct JyoutaiDef
{
internal string NumStr;
}
static void Solve(int pN)
{
Eratosthenes(pN);
var NSokumisuuList = new List<string>();
var stk = new Stack<JyoutaiDef>();
JyoutaiDef WillPush;
foreach (string EachStr in SosuuStrArr) {
WillPush.NumStr = EachStr;
stk.Push(WillPush);
}
int MaxNumLen = int.MinValue;
while (stk.Count > 0) {
JyoutaiDef Popped = stk.Pop();
int NumLen = Popped.NumStr.TrimStart('0').Length;
if (MaxNumLen < NumLen) {
MaxNumLen = NumLen;
NSokumisuuList.Clear();
}
if (MaxNumLen == NumLen)
NSokumisuuList.Add(Popped.NumStr);
for (char I = '0'; I <= '9'; I++) {
WillPush.NumStr = Popped.NumStr + I.ToString();
int FromInd = WillPush.NumStr.Length - pN;
string wkStr = WillPush.NumStr.Substring(FromInd);
if (Array.BinarySearch(SosuuStrArr, wkStr) < 0) continue;
if (Popped.NumStr.Contains(wkStr)) continue;
stk.Push(WillPush);
}
}
string MaxNSokumisuu = NSokumisuuList.Max();
Console.WriteLine("最大の{0}型組素数={1}", pN, MaxNSokumisuu);
Console.WriteLine("桁数={0}。同じ桁での個数={1}",
MaxNSokumisuu.Length, NSokumisuuList.Count);
Console.WriteLine();
}
}
実行結果
最大の2型組素数=619737131179
桁数=12。同じ桁での個数=192
最大の3型組素数=9419919379773971911373313179
桁数=28。同じ桁での個数=2860
経過時間=00:00:41.3486121
解説
深さ優先探索で順列を全探索してます。