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).

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2014年03月02日 02:21