-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathp10.py
More file actions
51 lines (46 loc) · 1.63 KB
/
p10.py
File metadata and controls
51 lines (46 loc) · 1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#coding: UTF-8
# Find the sum of all the primes below two million.
import math
def isprime(n):
n = abs(int(n))
if n < 2:
return False
if n == 2:
return True
if not n & 1:
return False
for x in range(3, int(n**0.5)+1, 2):
if n % x == 0:
return False
return True
def mul1(n):
s=0
for i in xrange(0,n):
if isprime(i):
s+=i
print s
#Sieve of Eratosthenes方法
#由于一个合数总是可以分解成若干个质数的乘积,那么如果把质数
#(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。
#例如要查找100以内的质数,首先2是质数,把2的倍数去掉;此时3
#没有被去掉,可认为是质数,所以把3的倍数去掉;再到5,再到7,
#7之后呢,因为8,9,10刚才都被去掉了,而100以内的任意合数肯
#定都有一个因子小于10(100的开方),所以,去掉,2,3,5,7
#的倍数后剩下的都是质数了。
def getPrimeList(limit):
sievebound = (limit-1) / 2
sieve = [False] * (sievebound + 1)
crosslimit = (int(math.sqrt(limit)) - 1) / 2
for i in range(1, crosslimit+1):
if not sieve[i]: # 2*i+1 is prime, mark multiples
for j in range(2*i*(i+1), sievebound+1, 2*i+1):
sieve[j] = True
sieve = [2*i+1 for i in range(1, sievebound+1) if not sieve[i]]
sieve.insert(0, 2)
return sieve
def mul2(n):
print sum(getPrimeList(n))
if __name__=='__main__':
import profile # profile the program
profile.run("mul1(2000000)") # 26.938s
profile.run("mul2(2000000)") # 0.469s