2014年3月15日土曜日

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

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 件のコメント:

コメントを投稿