2014年3月10日月曜日

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

Problem 9 「特別なピタゴラス数」 

ピタゴラス数(ピタゴラスの定理を満たす自然数)とは a < b < c で以下の式を満たす数の組である.
a2 + b2 = c2
例えば, 32 + 42 = 9 + 16 = 25 = 52 である.
a + b + c = 1000 となるピタゴラスの三つ組が一つだけ存在する.
これらの積 abc を計算しなさい.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%209



解法
Prolog言語

gcd(0, B, G) :- G is abs(B).
gcd(A, B, G) :- A =\= 0, R is B mod A, gcd(R, A, G).

calc_len(M,N,Len):-Len is 2*M*(M+N).

is_last(M,N):-M=<N.
is_last(M,N):-calc_len(M,N,Len),Len>1000.

is_calc_ok(M,N):-
  M>N,
(M-N) mod 2=:=1,
gcd(M,N,G),
G=:=1.

roopN(M,N,_):-
is_last(M,N),
!,
fail.
roopN(M,N,Result):-
is_calc_ok(M,N),
calc_len(M,N,Len),
1000 mod Len=:=0,
!,
Mult is 1000//Len,
Result is (M*M-N*N)*(2*M*N)*(M*M+N*N)*(Mult^3).

roopN(M,N,Result):-
!,
N1 is N+1,
roopN(M,N1,Result).

roopM(M,_):-
    is_last(M,1),
    !,
    fail.
roopM(M,Result):-
    roopN(M,1,Result).
roopM(M,Result):-
     !,
     M1 is M+1,
     roopM(M1,Result).

main9:-
     roopM(2,Ans),
     write(Ans).

0 件のコメント:

コメントを投稿