ihit's diary

ちょっとしたメモに

Project Euler 26, 27

26番
最長の循環小数を求める問題

#!/usr/bin/env python
# -*- coding: utf-8 -*-
max_ite = 0
max_d = 0
for i in range(2,1000):
	iterate = 0
	rest = 1
	rest_list = []
	while 1:
		rest = rest * 10 % i
		iterate += 1
		if rest == 0 or rest in rest_list:
			break
		rest_list.append(rest)
	if iterate > max_ite:
		max_ite = iterate
		max_d = i

print max_d

27番
二次式で素数が続く際の係数を求める問題
aは奇数,bは素数という条件のもとブルートフォースで解いたけどなんかもっといい方法ないかなあ

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#aは奇数,bは素数
def f(n,a,b):
	return n * n + a * n + b

def issosu(x):
	for i in range(3,x,2):
		if x % i == 0:
			return False
	return True

def make_b(n):
	b_list = range(2,n)
	b = []
	while b_list != []:
		sosu = b_list[0]
		b.append(b_list[0])
		sub_list = []
		for i in b_list:
			if i % sosu != 0:
				sub_list.append(i)
		b_list = sub_list[:]
	return b

max_len = 0
b_list = make_b(1000)
max_a = 0
max_b = 0
for a in range(-999,1001,2):
	for b in b_list:
		n = 1
		while f(n,a,b) > 0 and issosu(f(n,a,b)):
			n += 1
		if n > max_len:
			max_a = a
			max_b = b
			max_len = n
print max_a*max_b