C#でプロジェクトオイラーを解く(問題41「パンデジタル素数」)

プロジェクトオイラー
Pocket

どーも、みつおです。

出力の時間に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

コメント

タイトルとURLをコピーしました