Problem 4 「最大の回文積」 †
左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
では, 3桁の数の積で表される回文数の最大値を求めよ
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204
解法
Prolog言語
公式サイトに記載されてる解答例通り実装。
palindrome(N):-
number_codes(N,List),
reverse(List,List).
setB(A,990,11):-A mod 11>0,!.
setB(_,999,1):-!.
roopB(_,B,_,MaxPalindrome,MaxPalindrome):-B<100,!.
roopB(A,B,_,MaxPalindrome,MaxPalindrome):-
A*B=<MaxPalindrome,
!.
roopB(A,B,_,_,MaxPalindrome):-
MaxPalindrome is A*B,
palindrome(MaxPalindrome),
!.
roopB(A,B,Dell,MaxPalindrome,Result):-
!,
B1 is B-Dell,
roopB(A,B1,Dell,MaxPalindrome,Result).
roopA(A,MaxPalindrome,MaxPalindrome):-A<100,!.
roopA(A,MaxPalindrome,Result):-
!,
setB(A,B,Dell),
roopB(A,B,Dell,MaxPalindrome,MaxPalindrome1),
A1 is A-1,
roopA(A1,MaxPalindrome1,Result).
main4:-
roopA(999,0,Ans),
write(Ans).
number_codes(N,List),
reverse(List,List).
setB(A,990,11):-A mod 11>0,!.
setB(_,999,1):-!.
roopB(_,B,_,MaxPalindrome,MaxPalindrome):-B<100,!.
roopB(A,B,_,MaxPalindrome,MaxPalindrome):-
A*B=<MaxPalindrome,
!.
roopB(A,B,_,_,MaxPalindrome):-
MaxPalindrome is A*B,
palindrome(MaxPalindrome),
!.
roopB(A,B,Dell,MaxPalindrome,Result):-
!,
B1 is B-Dell,
roopB(A,B1,Dell,MaxPalindrome,Result).
roopA(A,MaxPalindrome,MaxPalindrome):-A<100,!.
roopA(A,MaxPalindrome,Result):-
!,
setB(A,B,Dell),
roopB(A,B,Dell,MaxPalindrome,MaxPalindrome1),
A1 is A-1,
roopA(A1,MaxPalindrome1,Result).
main4:-
roopA(999,0,Ans),
write(Ans).
0 件のコメント:
コメントを投稿