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

Problem 23 「非過剰数和」 †
2つの過剰数の和で表せない数全ての和を求めよという問題。
C++なら一瞬で答えが出るが、Prologはリスト処理しかない言語なのでこれより早くする方法を思いつかない。
計算時間83秒。



yaku(_,1,1):-!.
yaku(N,D,D):-N=:=D*D,!.
yaku(N,D,Result):-N mod D=:=0,!,Result is N//D+D.

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

yakusu_list(N,Result):-
	between(1,N,D),
	(D*D>N -> !,fail;yaku(N,D,Result)).
is_kajo(N):-
	findall(E,yakusu_list(N,E),Es),
	sum(Es,0,Wa),
	N<Wa.
kajo_list(E):-
	between(12,28123,E),
	is_kajo(E).


append(N,[X|_],Result,Result):-
       N+X>28123,
       !.
append(N,[X|Xs],[],[N1|Result]):-
	!,
	N1 is N+X,
	append(N,Xs,[],Result).

append(N,[X|Xs],[Y|Ys],[N1|Result]):-
N1 is N+X,
N1<Y,
!,
append(N,Xs,[Y|Ys],Result).

append(N,[X|Xs],[Y|Ys],[Y|Result]):-
	N1 is N+X,
	N1>Y,
	!,
	append(N,[X|Xs],Ys,Result).
append(N,[_|Xs],[Y|Ys],[Y|Result]):-
!,
	append(N,Xs,Ys,Result).

list_create([],Ys):-
	!,
	sum(Ys,0,Ans),
	Ans1 is 28123*28124//2-Ans,
	write(Ans1).

list_create([X|Xs],Ys):-
	append(X,[X|Xs],Ys,Ys1),
	write(X),nl,
	list_create(Xs,Ys1).

main:-
	findall(E,kajo_list(E),Kajo),
	list_create(Kajo,[0]). 
最終更新:2014年11月24日 01:10