解法
例えば2の場合、2乗すると2*10^202を越えないで一番近くなる自然数を2分探索すれば、実数計算や連分数展開がいりません。
後は求まった数字の前100桁の桁和を足せばいいだけです。
search(M,R,_,M):-M+1=:=R,!.
search(L,R,N,Result):-
M is (L+R)//2,
(M^2=<N->search(M,R,N,Result);search(L,M,N,Result)).
to_num(0,[]):-!.
to_num(N,[X|Result]):-
X is N mod 10,
N1 is N//10,
to_num(N1,Result).
sum100(100,_,Sum,Sum):-!.
sum100(Len,[X|Xs],Sum,Result):-
Len1 is Len+1,
Sum1 is Sum+X,
sum100(Len1,Xs,Sum1,Result).
sum([],Sum,Sum):-!.
sum([X|Xs],Sum,Result):-
Sum1 is Sum+X,
sum(Xs,Sum1,Result).
calc(E,_):-
member(E,[1,4,9,16,25,36,49,64,81,100]),
!,fail.
calc(E,Sum):-
N is E*10^202,
search(1,N,N,R),
to_num(R,List),
reverse(List,List1),
sum100(0,List1,0,Sum)
.
main:-
findall(E,(between(1,100,N),calc(N,E)),Es),
sum(Es,0,Ans),
write(Ans).
最終更新:2014年12月13日 14:11