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