Project Euler 80

 久しぶりに。

 高校の時の参考書に載っていた。
今見ても、こんな面倒な手順を覚えられるかと思う。

おおむねこんな感じ。なんだか教科書に乗っている手順をそのまま書き下しているだけなので、すごい汚いなぁ。

def getSqrtDigitSum( n, howmanydigits):
	if howmanydigits <= 0:
		return 0;
	dq = []
	result = 0;
	carry = 0;
	carry2 = 0;
	temp = n;
	while temp != 0:
		dq.insert( 0, temp % 100 )
		temp /= 100

	for i in dq:
		if howmanydigits <= 0:
			return result;
		howmanydigits -= 1
		carry += i;
		carry2 *= 10;
		nearest = 0;
		while carry >= ( carry2 + nearest  + 1 ) * ( nearest + 1 ):
			nearest += 1
		carry -= ( carry2 + nearest ) * nearest;
		carry *= 100;
		result += nearest;

		carry2 += 2 * nearest;

	while howmanydigits > 0:
		howmanydigits -= 1
		carry2 *= 10;
		nearest = 0;
		while carry >= ( carry2 + nearest  + 1 ) * ( nearest + 1 ):
			nearest += 1
		carry -= ( carry2 + nearest ) * nearest;
		carry *= 100;
		result += nearest;
		carry2 += 2 * nearest;
	return result;

本当はルートの中に小数点が入っていても解けるし、たぶん何乗根出会っても解けそうだけど、
とりあえず解ければいいや的になっているのが残念。

どうにも、数学的事実を知っているかどうか勝負になってきていてあまり最近やる気がしない。