Problem 32 「パンデジタル積」 †
すべての桁に 1 から n が一度だけ使われている数をn桁の数がパンデジタル (pandigital) であるということにしよう: 例えば5桁の数 15234 は1から5のパンデジタルである.
7254 は面白い性質を持っている. 39 × 186 = 7254 と書け, 掛けられる数, 掛ける数, 積が1から9のパンデジタルとなる.
掛けられる数/掛ける数/積が1から9のパンデジタルとなるような積の総和を求めよ.
HINT: いくつかの積は, 1通り以上の掛けられる数/掛ける数/積の組み合わせを持つが1回だけ数え上げよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2032解法
1桁*4桁=4桁
か
2桁*3桁=4桁。
しかないことがわかりますので
A*B=C
として
AとBの全パターンを試すだけです。
Cは文字列に直して中身をソートして使ってない数と同じになればそれは条件を満たします。
後は重複分をsortで削除してAcceptとなります。
perm([_],[_,_,_,_]).
perm([_,_],[_,_,_]).
set_num([],Nums,Nums):-!.
set_num([X|Xs],Nums,Result):-
select(X,Nums,Nums1),
set_num(Xs,Nums1,Result).
search(C):-
Nums=[49,50,51,52,53,54,55,56,57],
perm(List1,List2),
set_num(List1,Nums,Nums1),
set_num(List2,Nums1,Nums2),
number_codes(A,List1),
number_codes(B,List2),
C is A*B,
number_codes(C,List3),
msort(List3,Nums2).
sum([],0):-!.
sum([X|Xs],Result):-
!,
sum(Xs,Re),
Result is Re+X.
main32:-
findall(C,search(C),List),
sort(List,List1),
sum(List1,Ans),
write(Ans).
0 件のコメント:
コメントを投稿