プロジェクトオイラー問111

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20111
Problem 111 「重複桁を持つ素数」 †
重複桁と素数に関する問題。

重複桁が多いほうから全探索するだけです。



m(10).

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


search([],_,N,N):-
	is_prime(N),
	!.
search([X|Xs],Y,N,Res):-
	integer(X),
	N1 is N*10+X,
	search(Xs,Y,N1,Res).

search([X|Xs],Y,N,Res):-
	member(X,[0,1,2,3,4,5,6,7,8,9]),
	X=\=Y,
	N1 is N*10+X,
	search(Xs,Y,N1,Res).

top([X|_],_,_):-
	integer(X),
	X=:=0,
	!,
	fail.

top([X|Xs],Y,Res):-
	integer(X),
	!,
	search(Xs,Y,X,Res).

top([X|Xs],Y,Res):-
	member(X,[1,2,3,4,5,6,7,8,9]),
	X=\=Y,
	search(Xs,Y,X,Res).


search2(Xs,_,Z,_):-
	m(L),
	length(Xs,L),
	Z=\=0,
	!,
	fail.
search2(Xs,Y,0,Res):-
	m(L),
	length(Xs,L),
	!,
	top(Xs,Y,Res).
search2(Xs,Y,Z,Res):-
	Z1 is Z-1,
	search2([Y|Xs],Y,Z1,Res).
search2(Xs,Y,Z,Res):-
	search2([_|Xs],Y,Z,Res).


search3(N,Res):-
	m(Len),
	Len1 is Len-1,
	between(1,Len1,L),
 	L1 is Len-L,
	findall(E,search2([],N,L1,E),Res),
	Res\=[],
	!.

 sum([],Sum,Sum):-!.
sum([X|Xs],Sum,Res):-
	Sum1 is Sum+X,
	sum(Xs,Sum1,Res).
main111:-
	findall(E,(between(0,9,N),search3(N,E)),Es),
	flatten(Es,Es1),
	sum(Es1,0,Ans),
	write(Ans).
最終更新:2015年11月13日 10:07