久しぶりに解きました。
あんまり良いプログラムではないけど…
Problem 46(日本語)
Problem 46(本家サイト)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
%problem 46 :-lib(ic). solve:- PrimeMax is 100000, assert(max(PrimeMax)), make_list(PrimeMax,Lst), eratosthenes_sieve(Lst,PrimeLst), % エラトステネスのふるいによる素数列挙 Prime1#::PrimeLst, Prime2#::PrimeLst, A#=Prime1*Prime2, A#=_*2+1, % Aは奇数 indomain(A,min), ( Prime#::PrimeLst, B#>0, (A-Prime)/2 #= B*B, labeling([B])-> ( % printf(output,"%d = %d + 2*%d^2\n",[A,Prime,B]), % flush(output) true ); ( labeling([Prime1,Prime2]), printf(output,"answer %d = %d * %d\n",[A,Prime1,Prime2]), flush(output), abort ) ), fail. mk_lst([],_,[]):-!. mk_lst([First|Rest],Th,[Rest]):- First>Th, mk_lst(Rest,Th,Rest). mk_lst([First|Rest],Th,[First|Rest]):- mk_lst(Rest,Th,Rest). % 2 ~ Idx までのリストを作成 make_list(Idx,List):- make_list_sub(Idx,List,[]). make_list_sub(1,Ret,Ret):-!. make_list_sub(Idx,Ret,List):- Idx1 is Idx - 1, make_list_sub(Idx1,Ret,[Idx | List]). % 素数列挙 エラトステネスのふるい eratosthenes_sieve([],[]):-!. eratosthenes_sieve([First | Rest],[First | Rest]):- max(Max), First * First > Max , !. eratosthenes_sieve([First | Rest], [First | Ret]):- erase_baisu(First,Rest,Rest1), eratosthenes_sieve(Rest1,Ret). erase_baisu(_,[],[]):-!. erase_baisu(Base,[First | Rest],[First | Ret]):- First mod Base =\= 0, !, erase_baisu(Base,Rest,Ret). erase_baisu(Base,[_ | Rest],Ret):- erase_baisu(Base,Rest,Ret). |
実行結果(回答伏せます)
solve.
answer XXXX = XXXX * XXXX
Aborting execution ...