※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


Problem 65 「e の近似分数」 †

eの連分数展開に関する問題。
詳細はリンク先参照のこと。



解法
定義通り計算。
分数を上から計算するとかなり難しいので分数を一番下から計算していく。

d(C,1):-
	C mod 3<2,
	!.
d(C,Result):-
	!,
	Result is  2*(C // 3 + 1).

sum([],0):-!.
sum([X|Xs],Result):-sum(Xs,Re),Result is Re+X-48.

calc(C,_,_):-
	C<0,
	!,
	fail.

calc(0,Up,Down):-
	!,
	Up1 is Up+Down*2,
	Down1 is Down,
	gcd(Up1,Down1,G),
	Up2 is Up1//G,
	number_codes(Up2,List),
	sum(List,Ans),
	write([Ans]).

calc(C,Up,Down):-
	!,
	d(C,D),
	Down1 is D*Down+Up,
	Up1 is Down,
 	gcd(Up1,Down1,G),
	Down2 is Down1//G,
	Up2 is Up1//G,
	C1 is C-1,
	calc(C1,Up2,Down2).


calc_w(C):-
 	C1 is C-1,
	d(C,D),
	calc(C1,0,D).

main65:-
	calc_w(100).