[普及] 筛法和窗口式扫描 project euler 50

http://projecteuler.net/index.php?section=problems&id=50

求1,000,000哪个素数能被写成最多的素数和?

hint1: 筛法不会可以google: 线性筛法. 有非常多文章描述,不再赘述

hint2:窗口式扫描,如果求数列中所有连续k个数的和,可以维护一个值sum,
初始时sum = a[1...k-1],每次加入一个新元素,删除最前面的元素.

具体看代码.python写的,即使不会python应该也比较好理解.



#!/usr/bin/python
# coding=utf-8

pn = 1000000
primes = []
is_prime = [True for i in range(pn)]
is_prime[0] = False
is_prime[1] = False
for i in range(2, pn):
	if is_prime[i]: primes.append(i)
	for j in primes:
		if i * j >= pn: break
		is_prime[i * j] = False
		if i % j == 0: break 

val = 0; ans = 0; end = 0
for num in range(1000,0,-1):
	if (num % 100 == 0): print "%d:" % num
	cur = 0
	for i in range(0, num - 1):
		cur += primes[i]
	for i in range(num-1, len(primes)):
		cur += primes[i]
		if cur < 1000000 and is_prime[cur] and num > val:
			end = i + 1
			val = num
			ans = cur
		cur -= primes[i - num + 1]

print "ans = %d , val = %d" % (ans, val)

posted on 2011-04-03 00:08  schindlerlee  阅读(227)  评论(0编辑  收藏  举报