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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2038
Problem 38 「パンデジタル倍数」 †
num*1,num*2,num*3,,,num*n
な数を結合した時1~9までの数字が一度ずつ現れるようなnumのうち、結合後の数字が最も大きくなるnumの結合後の数字をを答えよ。
ただしn>1とする。
n=2のとき9999より大きくなると結合後が9桁を越えるのでそれに注意して全探索するだけです。
手短な筆算でも解けるみたいです。



to_list(0,[]):-!.
to_list(N,[X|Xs]):-
	X is N mod 10,
	N1 is N//10,
	to_list(N1,Xs).

dell([],Seed,Seed):-!.
dell([X|Xs],Seed,Result):-
	select(X,Seed,Seed1),
	!,
	dell(Xs,Seed1,Result).

check(_,N,[],Con,Con):-N>1,!.
check(_,_,[],Con,Con):-!,fail.
check(Num,N,Seed,Con,Result):-
	N1 is N+1,
	Num1 is Num*N,
 	to_list(Num1,List),
	dell(List,Seed,Seed1),
	reverse(List,ListR),
	append(Con,ListR,Con1),
	check(Num,N1,Seed1,Con1,Result).

search(Con):-
	between(1,9999,Num),
	check(Num,1,[1,2,3,4,5,6,7,8,9],[],Con).

main:-
	findall(E,search(E),Es),
	sort(Es,Es1),
	reverse(Es1,[Ans|_]),
	write(Ans).
最終更新:2014年12月03日 10:39