トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Problem37 切り詰めても素数になる数の総和
問題
3797は面白い性質を持っている. まずそれ自身が素数であり,
左から右に桁を除いたときに全て素数になっている(3797, 797, 97, 7).
同様に右から左に桁を除いたときも全て素数である(3797, 379, 37, 3).
右から切り詰めても左から切り詰めても素数になるような素数は11個しかない.総和を求めよ.
注: 2, 3, 5, 7を切り詰め可能な素数とは考えない.
ソース
using System;
using System.Linq;
class Program
{
static int[] SosuuArr = new int[740001];
//エラトステネスの篩
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;
}
}
}
SosuuArr = SosuuArr.Where(X => X != 0).ToArray();
}
static void Main()
{
Eratosthenes();
int SumVal = 0, Rest = 11;
for (int I = 1; I <= SosuuArr.GetUpperBound(0); I++) {
if (SosuuArr[I] < 10) continue;
bool IsOK = true;
for (int J = 10; J <= SosuuArr[I]; J *= 10) {
if (Array.BinarySearch<int>(SosuuArr, SosuuArr[I] / J) < 0) {
IsOK = false; break;
}
if (Array.BinarySearch<int>(SosuuArr, SosuuArr[I] % J) < 0) {
IsOK = false; break;
}
}
if (IsOK) {
Console.WriteLine("{0,7},SumVal={1,7}", SosuuArr[I], SumVal += SosuuArr[I]);
if (--Rest == 0) return;
}
}
}
}
実行結果
23,SumVal= 23
37,SumVal= 60
53,SumVal= 113
73,SumVal= 186
313,SumVal= 499
317,SumVal= 816
373,SumVal= 1189
797,SumVal= 1986
3137,SumVal= 5123
3797,SumVal= 8920
739397,SumVal= 748317
解説