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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20104
Problem 104 「両端がパンデジタルなフィボナッチ数」 †
フィボナッチ数列の上位桁と下位桁が1~9を並べ替えたものになるのは何番目か?

解法
手前の計算の上位桁への波及速度より桁の増加スピードのほうが大きくなるために上位桁を適当な長さに切っておけば大丈夫です。
本当はこの実装だと9桁までに123456789を並べ替えたものが出た場合間違った答えが出るのでひと手間必要なのだが。
まあ正しい答えが出たのでよしかな。

cut(F2,F3,F22,F33):-
	F3>10^16,
	!,
	F22 is F2//10, 
	F33 is F3//10.
cut(F2,F3,F2,F3):-!.

to_list2(0,[]):-!.
to_list2(N,[X|Xs]):-
	X is N mod 10,
	N1 is N//10,
	to_list2(N1,Xs).

to_list(N,List2):-
	to_list2(N,List),
	reverse(List,List2).

is_pan(_,[]):-!.
is_pan([X|Xs],Nums):-
	select(X,Nums,Nums1),
 	is_pan(Xs,Nums1).


search(_,F2,_,F4,Ans):-
	to_list(F2,List2),
	is_pan(List2,[1,2,3,4,5,6,7,8,9]),
 	to_list(F4,List4),
	is_pan(List4,[1,2,3,4,5,6,7,8,9]),
	!,
	write(Ans).
search(F1,F2,F1A,F2A,Ans):-
	F3 is F2+F1,
	Ans1 is Ans+1,
 	cut(F2,F3,F22,F33),
	F3A is (F1A+F2A) mod 10^9,
	search(F22,F33,F2A,F3A,Ans1).
main:-search(1,1,1,1,2).
最終更新:2014年12月31日 04:01