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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2035
Problem 35 「巡回素数」 †
100万以下の巡回素数の個数を数える問題。
巡回した時2桁以上の数では末尾が0,2,4,5,6,8になったら巡回素数ではない。
よって残りの1,3,7,9だけを調べればよい。

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)).

check(0,_,_):-!.
check(Len,Keta,Num):-
	is_prime(Num),
	Len1 is Len-1,
 	Num1 is Num//10+(Num mod 10)*(10^(Keta-1)),
	check(Len1,Keta,Num1).


seed(Len,Num,Num):-
	Len>1,
	check(Len,Len,Num).
seed(Len,Num,Result):-
	Len<6,
 	member(E,[1,3,7,9]),
	Len1 is Len+1,
	Num1 is Num*10+E,
	seed(Len1,Num1,Result).

main:-
 	findall(E,seed(0,0,E),Es),
	length(Es,Ans),
	Ans2 is Ans+4,
	write(Ans2).
最終更新:2014年12月03日 09:35