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

「prolog勉強プロジェクトオイラー21~30」の編集履歴(バックアップ)一覧に戻る

prolog勉強プロジェクトオイラー21~30 - (2013/07/09 (火) 20:09:52) の編集履歴(バックアップ)


プロジェクトオイラーの問題をPrologで解くページ。
創価学会の皆さまから原小学校の算数までしかできないと言われている堀江伸一さんがこのページのコードを書いているようです。


独り言
今日見つけたもの。
2チャンネル発の文化 今北産業物(今来た三行で説明しろという意味)の流れをくむもののリンク。
http://matome.naver.jp/odai/2126386911055428601

今日はリンク先質問には答えたけどこういう子どもには何と答えればよいのだろう、こういう子どもをきちんと教育するのは大人なら誰にでも責任があるものだとは思うけど?
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12110042462



問い21

http://projecteuler.net/problem=21
10000以下の友愛数の和を求めよという問題。
そのまま定義通り計算するだけです。
複数の関数で一つの関数を表現するPrologて独特だよな。

yakusuu_sum(1,_,1,Sum,Sum):-!.
yakusuu_sum(N,M,1,Sum,Sum1):-N<M*M,!,Sum1 is Sum*(N+1).
yakusuu_sum(N,M,Multi,Sum,Result):-
0=:=N mod M,!,
N1 is N//M,
Multi1 is Multi*M+1,
yakusuu_sum(N1,M,Multi1,Sum,Result).
yakusuu_sum(N,M,Multi,Sum,Result):-
Sum1 is Sum*Multi,
M1 is M+1,
yakusuu_sum(N,M1,1,Sum1,Result).
yakusuu_sum_w(N,Result):- 
yakusuu_sum(N,2,1,1,Result).

check(N):-yakusuu_sum_w(N,N1),N2 is N1-N,N\==N2,yakusuu_sum_w(N2,N3),
        N4 is N3-N2,N=:=N4.
calc(N):-
	between(2,10000,N),check(N).
sum([],Sum,Sum):-!.
sum([X|Rest],Sum,Result):-Sum1 is Sum+X,sum(Rest,Sum1,Result).

main21:-findall(N,calc(N),List),sum(List,0,Ans),write(Ans).