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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2037
Problem 37 「切り詰め可能素数」 †
2桁以上の右から切り詰めても左から切り詰めても全て素数となるような数は11種類しかない。
総和を求めよ。
一桁の数から初めて数字の桁を左へ伸ばしていきます。
伸ばすたびに右から切り詰めて全て素数ならそれが答え。
この辺の問題は単なる実装ゲームが多いです。


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


to_num([],Num,Num):-!.
to_num([X|Xs],Num,Result):-
	Num1 is Num*10+X,
	to_num(Xs,Num1,Result).

check(0):-!.
check(Num):-
	is_prime(Num),
	Num1 is Num//10,
	check(Num1).


search(List,Num):-
	member(E,[2,3,5,7]),
	to_num([E|List],0,Num),
	Num>10,
	check(Num).
search(List,Result):-
	member(E,[1,3,7,9]),
	List1=[E|List],
	to_num(List1,0,Num),
	is_prime(Num),
	search(List1,Result).
sum([],Sum,Sum):-!.
sum([X|Xs],Sum,Result):-
	Sum1 is Sum+X,
	sum(Xs,Sum1,Result).

main:-
	findall(Num,(member(E,[3,7]),search([E],Num)),Es),
	msort(Es,Es1),
	write(Es1),
	sum(Es,0,Ans),
	write(Ans).
最終更新:2014年12月03日 10:19