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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2091
Problem 91 「整数座標における直角三角形」 †
原点とそのほかの整数点2点で構成される直角三角形の数を数える問題。


三角形の辺がX軸Y軸にある場合。
片方だけが軸状にある場合。
両辺がXY軸状にない場合で、一辺が決まった場合。
で場合わけして計算するだけです。

gcd(0, B, B).
gcd(A, B, G) :- A > 0, R is B mod A, gcd(R, A, G). 

min(A,B,A):-A<B,!.
min(_,B,B):-!.
 
calc(Count):-
	between(1,50,X),
	between(1,50,Y),
gcd(X,Y,G),
	X1 is X//G,
	Y1 is Y//G,
	C1X is X//Y1,
	C1Y is (50-Y)//X1,
	min(C1Y,C1X,C1),
	C2X is (50-X)//Y1,
 	C2Y is Y//X1,
	min(C2X,C2Y,C2),
	Count is C1+C2.

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

main:-
	TypeA is 50*50*2,
	TypeB is 50*50,
	findall(E,calc(E),Es),
	sum(Es,0,Ans),
	Ans1 is Ans+TypeA+TypeB,
	write(Ans1).
最終更新:2014年12月19日 09:33