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.
开始的思路是逐个数做素性判断,然后做成素数表或直接累加。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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下别人的代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)