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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2033
Problem 33 「桁消去分数」 †
2桁の分数に関する問題。


Prologの特徴を利用して全探索してみたけれど?
なんか無駄な処理をしている気がする。

gcd(0, B, G) :- G is abs(B).
gcd(A, B, G) :- A =\= 0, R is B mod A, gcd(R, A, G).

perm(A,B,C,U,D):-U is A*10+C,D is B*10+C.
perm(A,B,C,U,D):-U is C*10+A,D is B*10+C.
perm(A,B,C,U,D):-U is A*10+C,D is C*10+B.
perm(A,B,C,U,D):-U is C*10+A,D is C*10+B.
bad(U,D):-U mod 11=:=0,D mod 11=:=0.
ok(U,D):-D<U,not(bad(U,D)).


mult([],1,1):-!.
mult([[X,Y]|Xs],ReX1,ReY1):-
	mult(Xs,ReX,ReY),
	ReX1 is ReX*X,
	ReY1 is ReY*Y.


search([U,D]):-
	between(1,9,A),
 	between(1,9,B),
	between(1,9,C),
	perm(A,B,C,U,D),
	ok(U,D),
	gcd(U,D,R1),
	gcd(A,B,R2),
 	U//R1=:=A//R2,
	D//R1=:=B//R2.

main:-
	findall(E,search(E),Es),
	mult(Es,U,D),
	write([U,D]),
 	gcd(U,D,R),
	U1 is U//R,
	write(U1).
最終更新:2014年12月01日 09:14