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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2034
Problem 34 「桁の階乗」 †
各桁の階乗和が元の数字と同じになるものを求めよ。
123、132、213、231、312,321の階乗和は同じ値になるので123だけ調べて階乗和が123を並べ替えたものと同じになるか調べればよい。



check(0,[]):-!.
check(0,_):-!,fail.
check(N,Xs):-
	X is N mod 10,
	select(X,Xs,Xs1),
	!,
	N1 is N//10,
	check(N1,Xs1).

fact(0,1):-!.
fact(N,Result):-
	N1 is N-1,
	fact(N1,Re),
	Result is Re*N.

perm(7,_,[],Sum,Sum):-!.
perm(_,_,[],Sum,Sum):-Sum>2.
perm(Len,N,[X|Xs],Sum,Result):-
	!,
	between(N,9,X),
 	fact(X,Add),
	Sum1 is Sum+Add,
	Len1 is Len+1,
	perm(Len1,X,Xs,Sum1,Result).

sum([],Sum,Sum):-!.
sum([X|Xs],Sum,Result):-
	Sum1 is Sum+X,
	sum(Xs,Sum1,Result).

search(Sum):-
	perm(0,0,Xs,0,Sum),
	not(Xs=[1]),
	check(Sum,Xs).

main:-
	findall(E,search(E),Es),
	sum(Es,0,Ans),
	write(Ans).
最終更新:2014年12月01日 09:25