Project Euler – 問題41

n桁の数が1からnまでの数字を1回ずつ含むときにpandigitalと呼ぶことにする。 例えば、2143は4桁のpandigitalであり素数である。

もっとも大きなpandigitalな素数を求めよ

問題27で定義した素数判定関数は何度も計算を繰り返さない代わりにその数以 下の素数のリストを全て計算するので大きな数を判定するときに非常に低速で ある。ここでは判定のたびに計算するが大きな数で判定で多少高速な isPrimeを定義する。

次に問題の定義に従って2桁から9桁までの全てのpandigitalな数のリストを生 成し、その中で素数のものを取り出し最大値を求める。

isPrime n = all (\x -> n `mod` x /= 0)
            $ takeWhile (\x -> x * x <= n) primes

euler041 = maximum $ filter isPrime
           $ map listToInt $ concat [permutation [1..n] | n <- [2..9]]