Project Euler 010 200万内的素数和

Problem 10

The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

Find the sum of all the primes below two million.

 

开始的思路是逐个数做素性判断,然后做成素数表或直接累加。

View Code
import time
def pe010BF(n):
    t1 = time.time()
    sumOfPrime = 2
    for k in range(3, n, 2):
        isPrime = True
        for i in range(3, int(k**1/2)+1, 2):
            if k % i == 0:
                isPrime = False
                break
        if isPrime == True:
            sumOfPrime += k
    print(sumOfPrime)
    t2 = time.time()
    print 'Running time:', t2 - t1
    print('')

这运行时间完全不达标。在网上看了下,用了筛法做素数表的思路。

def pe010List(n):
    t3 = time.time()
    sumOfPrime = 0
    composite = [False for i in range(n)]
    maxP = int(n**1/2) + 2
    composite[0] = True
    for p in range(1, maxP):
        if  not composite[p]:
            for k in range(p*2+1, n, p+1):
                composite[k] = True
    for i in range(n):
        if not composite[i]:
            sumOfPrime += i + 1
    print(sumOfPrime)
    t4 = time.time()
    print 'Running time:', t4 - t3

这下不错了。

btw,看了下其他人的代码,发现逐个数素性判断的思路,经过优化后,运行时间还是可以接受的。

copy下别人的代码

View Code
import math

def is_prime(n): 
    if n == 1:
        return False
    elif n<4:
        return True
    elif n%2 == 0:
        return False
    elif n<9 :
        return True
    elif n%3 == 0:
        return False
    r = math.floor(math.sqrt(n))
    f = 5
    while f<=r:
        if n%f == 0: return False
        if n%(f+2) == 0: return False
        f = f+6
    return True



summ = 0

for i in range(3,2000001):
    if (is_prime(i)):
        #print(i)
        summ = summ + i

summ = summ + 2

print(summ)

 

posted @ 2012-12-05 22:01  river_run  阅读(273)  评论(0编辑  收藏  举报