どーも、みつおです。
出力の時間に30分くらいかかった。
改善の余地あり。。。
問題
n桁パンデジタルであるとは, 1からnまでの数を各桁に1つずつ持つこととする.
#下のリンク先にあるような数学的定義とは異なる
例えば2143は4桁パンデジタル数であり, かつ素数である. n桁(この問題の定義では9桁以下)パンデジタルな素数の中で最大の数を答えよ.
出典:Problem41
解答
using System;
using System.Linq;
namespace Problem41
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Solve());
Console.ReadLine();
}
private static long Solve()
{
long ret = 0;
//9桁のパンデジタル数の最大値からループ
for(long i = 987654321; i >= 1; i--)
{
//パンデジタル数か判定
if(IsPandigital(i,i.ToString().Length))
{
//素数か判定
if(IsSosu(i))
{
ret = i;
break;
}
}
}
return ret;
}
private static bool IsPandigital(long no, int keta)
{
bool ret;
string strketa = "";
//文字列に変換
string strdata = no.ToString();
//パンデジタル数の並びを取得
for (int i = 1; i <= keta; i++) strketa += i.ToString();
//パンデジタル判定
Predicate<string> IsPandigi = A => A.OrderBy(B => B).SequenceEqual(strketa);
//文字の長さが同じかつ 数値が全て使われていればパンデジタル判定
ret = strdata.Length == keta && IsPandigi(strdata.ToString());
return ret;
}
private static bool IsSosu(long no)
{
bool ret = true;
//数値が2未満(1)なら素数じゃない、2なら素数
if (no < 2) return false;
else if (no == 2) return true;
//数値が2で割り切れるなら素数じゃない
if (no % 2 == 0) return false;
//合成数xはp≦√xを満たす素因子pをもつ
double sqrtno = Math.Sqrt(no);
//奇数でループ
for (int i = 3; i <= sqrtno; i += 2)
{
//割り切れるので素数じゃない
if (no % i == 0) return false;
}
return ret;
}
}
}
出力
7652413