トップページに戻る
次の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拡張メソッドで行ってもいいかもしれません。