優化前
import math
def prime(n):
if n%2 == 0:
return n==2
if n%3 == 0:
return n==3
if n%5 == 0:
return n==5
for p in range(7,int(math.sqrt(n))+1,2): #只考慮奇數作爲可能因子
if n%p == 0:
return 0
return 1
if __name__ == "__main__":
n = int(input(">>"))
count = 0
star_time = time.time()
for i in range(2, n + 1): # 1不是素數,從2開始
if prime1(i):
# print(i)
count += 1
print(count)
end_time = time.time()
print(end_time - star_time)
執行結果:
>>2000000
148933
5.532246351242065
優化後
def prime(n):
flag = [1] * (n + 2)
p = 2 # 第一個質數
count = 0 # 用於計算質數的數量
while (p <= n):
# print(p)
count += 1
# 把質數的倍數,設爲非質數
for i in range(2 * p, n + 1, p):
flag[i] = 0
# 找出下一個質數
while 1:
p += 1 # p自增
if (flag[p] == 1): # 當p是質數,跳出內層循環
break
print(count)
# test
if __name__ == "__main__":
n = int(input(">>"))
star_time = time.time()
prime(n)
end_time = time.time()
print(end_time - star_time)
執行結果:
>>2000000
148933
0.5664565563201904