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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2036
Problem 36 「二種類の基数による回文数」 †
100万以下の10進数でも2進数でも回文数になる数の和を答えよ。


seed([_]).
seed([A,A]).
seed([A,_,A]).
seed([A,B,B,A]).
seed([A,B,_,B,A]).
seed([A,B,C,C,B,A]).


set_num([],Num,Num):-!.
set_num([X|Xs],Num,Result):-
	member(X,[0,1,2,3,4,5,6,7,8,9]),
	Num1 is Num*10+X,
	set_num(Xs,Num1,Result).

to_bit2(0,[]):-!.
to_bit2(N,[B|Bits]):-
	N1 is N//2,
	B is N mod 2,
	to_bit2(N1,Bits).

search(Num):-
	seed([Top|Rest]),
	member(Top,[1,2,3,4,5,6,7,8,9]),
	set_num([Top|Rest],0,Num),
	to_bit2(Num,List),
	reverse(List,List).

sum([],Sum,Sum):-!.
sum([X|Xs],Sum,Result):-
	Sum1 is Sum+X,
	sum(Xs,Sum1,Result).
main:-
	findall(E,search(E),Es),
	sum(Es,0,Ans),
	write(Ans).

タグ:

+ タグ編集
  • タグ:

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

最終更新:2014年12月03日 09:47