2014年3月15日土曜日

プロジェクトオイラー Problem 41 「パンデジタル素数」 †

Problem 41 「パンデジタル素数」 

n桁パンデジタルであるとは, 1からnまでの数を各桁に1つずつ持つこととする.
#下のリンク先にあるような数学的定義とは異なる
例えば2143は4桁パンデジタル数であり, かつ素数である. n桁(この問題の定義では9桁以下)パンデジタルな素数の中で最大の数を答えよ.


解法
まあ1~9、1~8までの各桁の和を足すと9の倍数になるので素数が存在しません。
7ケタの場合を全部検討して素数が見つかれば。
それが答えだ(ウルフルズ風味な節をつけて、古いな)。


not_prime(N):-N<2,!.
not_prime(N):-
      between(2,N,D),
      (D*D>N->!,fail;true),
      N mod D=:=0,
      !.
is_prime(N):-not(not_prime(N)).

perm([],[]):-!.
perm(List,[X|Result]):-
      select(X,List,List1),
      perm(List1,Result).

search(Num):-
      List=[49,50,51,52,53,54,55],
      perm(List,NumList),
      number_codes(Num,NumList),
      is_prime(Num).

main41:-
      findall(E,search(E),List),
      msort(List,List1),
      reverse(List1,[Top|_]),
      write(Top).

0 件のコメント:

コメントを投稿