プロジェクトオイラー問80

roblem 80 「平方根の10進展開」 †
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2080
2の平方根の前100桁の桁和は475となる。
1~100の数字の平方根のうち無理数になるもので同様に和を求め、その総和を求めよ。



解法
例えば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