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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2039
Problem 39 「整数の直角三角形」 †
辺の長さが {a,b,c} と整数の3つ組である直角三角形を考え, その周囲の長さを p とする. p = 120のときには3つの解が存在する:
{20,48,52}, {24,45,51}, {30,40,50}
p ≤ 1000 のとき解の数が最大になる p はいくつか?

count述語とか書いてるとリストに対するSQL的なものがほしくなるな。


gcd(0,G,G):-!.
gcd(A,B,G):-
	C is B mod A,
	gcd(C,A,G).

searchK(L,Result):-
	between(1,1000,K),
	Result is K*L,
	(1000=<Result->!,fail;true).

searchMN(Result):-
	between(2,40,M),
	between(1,M,N),
	(M-N) mod 2=:=1,
	gcd(M,N,G),
	G=:=1,
	L is 2*M*(M+N),
	L<1000,
	searchK(L,Result).
count([],E,[E]):-!.
count([L|Ls],[Count,L],Result):-
	!,
	Count1 is Count+1,
	count(Ls,[Count1,L],Result).
count([L|Ls],E,[E|Es]):-
 	!,
	count(Ls,[1,L],Es).

main:-
	findall(E,searchMN(E),Es),
	msort(Es,[Top|Es1]),
	count(Es1,[1,Top],Es2),
	sort(Es2,Es3),
	reverse(Es3,[Ans|_]),
	write(Ans).
最終更新:2014年12月03日 11:08