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


Problem 65 「e の近似分数」 †

eの近似分数の100項めの分子の各桁の和を求める問題。
指定されたとおりに連分数計算を実装するだけです。

next(1,1):-!.
next(N,N2):-!,N2 is N+2.

list(1,[X,_,_],[X]):-!.
list(L,[X,Y,Z],[X|Result]):-
	next(X,X1),
	L1 is L-1,
	list(L1,[Y,Z,X1],Result).

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

calc([],U,D):-
	!,
	U1 is U+D*2,
	D1 is D,
	gcd(U1,D1,G),
	U2 is U1//G,
	wa(U2,0,Ans),
	write(Ans).
calc([X|Xs],U,D):-
 	U1 is U+D*X,
	D1 is D,
      gcd(U1,D1,G),
	U2 is U1//G,
	D2 is D1//G,
	calc(Xs,D2,U2).

wa(0,Sum,Sum):-!.
wa(N,Sum,Result):-
	N1 is N//10,
	Sum1 is Sum+(N mod 10),
	wa(N1,Sum1,Result).

main:-
	list(99,[1,2,1],List),
	reverse(List,[S|List1]),
	calc(List1,1,S).
最終更新:2014年12月12日 12:54