Problem 30 「各桁の5乗」 †
驚くべきことに, 各桁を4乗した数の和が元の数と一致する数は3つしかない.
- 1634 = 14 + 64 + 34 + 44
- 8208 = 84 + 24 + 04 + 84
- 9474 = 94 + 44 + 74 + 44
ただし, 1=14は含まないものとする. この数たちの和は 1634 + 8208 + 9474 = 19316 である.
各桁を5乗した数の和が元の数と一致するような数の総和を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2030解法
辞書順で数字列を生成し、数字列の5乗和をとります。
001357という具合でA=0^5+0^5+1^5+3^5+7^5。
5乗和の数字Aを文字列に直して、6ケタに足らない場合6文字になるまで先頭に0を補って、
この文字列の中身ソートしたものが元の辞書順数字列と同じならその数は条件を満たします。
to_num([],0):-!.
to_num([X|Xs],Result):-
!,
to_num(Xs,Re),
Result is Re+(X-48)^5.
add_zero2(List,0,List):-!.
add_zero2(List,Len,Result):-
!,
Len1 is Len-1,
add_zero2([48|List],Len1,Result).
add_zero(List,Result):-
length(List,Len),
Len1 is 6-Len,
add_zero2(List,Len1,Result).
search(Num):-
between(48,57,X1),
between(X1,57,X2),
between(X2,57,X3),
between(X3,57,X4),
between(X4,57,X5),
between(X5,57,X6),
List1=[X1,X2,X3,X4,X5,X6],
to_num(List1,Num),
Num>1,
number_codes(Num,List2),
msort(List2,List3),
add_zero(List3,List4),
List4==List1.
sum([],0):-!.
sum([X|Xs],Result):-
!,
sum(Xs,Re),
Result is Re+X.
main30:-
findall(E,search(E),AnsList),
sum(AnsList,Ans),
write(Ans).
0 件のコメント:
コメントを投稿