※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

「プロジェクトオイラー問36」の編集履歴(バックアップ)一覧に戻る

プロジェクトオイラー問36 - (2014/02/14 (金) 18:16:44) の1つ前との変更点

追加された行は青色になります

削除された行は赤色になります。

+http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2036
+*Problem 36 「二種類の基数による回文数」 †
+585 = 10010010012 (2進) は10進でも2進でも回文数である.
 
+100万未満で10進でも2進でも回文数になるような数の総和を求めよ.
+
+(注: 先頭に0を含めて回文にすることは許されない.)
+
+
+
+解法
+10進数の回文数だけをpermとtoNumで作って、それが2ビットでも回文数であるか調べるだけです。
+
+ perm([_]).
+ perm([X,X]).
+ perm([X,_,X]).
+ perm([X,Y,Y,X]).
+ perm([X,Y,_,Y,X]).
+ perm([X,Y,Z,Z,Y,X]).
+ 
+ toBit(0,[]):-!.
+ toBit(N,[X|Result]):-
+ 	X is N mod 2,
+ 	N1 is N//2,
+ 	toBit(N1,Result).
+ 
+ toNum([],0):-!.
+ toNum([X|Xs],Result):-
+ 	toNum(Xs,Re),
+ 	Result is Re*10+X.
+ 
+ commitPerm([]):-!.
+ commitPerm([X|Xs]):-
+ 	member(X,[0,1,2,3,4,5,6,7,8,9]),
+ 	commitPerm(Xs).
+ 
+ all_search(N):-
+ 	perm(Perm),
+ 	commitPerm(Perm),
+ 	[Top|_]=Perm,
+ 	Top>0,
+ 	toNum(Perm,N),
+ 	toBit(N,Bits),
+  	reverse(Bits,Bits).
+ 
+ sum([],0):-!.
+ sum([X|Xs],Result):-
+ 	sum(Xs,Re),
+  	Result is Re+X.
+ 
+ main36:-
+ 	findall(N,all_search(N),Nums),
+ 	sum(Nums,Ans),
+ 	write(Ans).