Problem 36 「二種類の基数による回文数」 †
585 = 10010010012 (2進) は10進でも2進でも回文数である.
100万未満で10進でも2進でも回文数になるような数の総和を求めよ.
(注: 先頭に0を含めて回文にすることは許されない.)
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2036
解法
10進数で回文数だけを生成してそれが2進数でも回文数か調べればよいだけです。
perm([_]).
perm([X1,X1]).
perm([X1,_,X1]).
perm([X2,X1,X1,X2]).
perm([X2,X1,_,X1,X2]).
perm([X3,X2,X1,X1,X2,X3]).
to_num([],0):-!.
to_num([X|Rest],Result):-
!,
member(X,[0,1,2,3,4,5,6,7,8,9]),
to_num(Rest,Re),
Result is Re*10+X.
to_2bit(0,[]):-!.
to_2bit(N,[X|Result]):-
!,
X is N mod 2,
N1 is N//2,
to_2bit(N1,Result).
search(Num):-
perm(List),
to_num(List,Num),
[Top|_]=List,
Top>0,
to_2bit(Num,List2),
reverse(List2,List2).
sum([],0):-!.
sum([X|Xs],Result):-
!,
sum(Xs,Re),
Result is Re+X.
main36:-
findall(E,search(E),List),
sum(List,Ans),
write(Ans).
0 件のコメント:
コメントを投稿