题目:给定一个正整数n,计算出小于等于n的质数有多少个。 比如17,则返回7,因为小于等于7的质数有2,3,5,7,13,17
常规做法:
从2-N开始循环,然后取到一个数字i,判断在2至
i
\sqrt{i}
i的范围内是否会被整除。
这样的坏处是:两层for循环,时间开销大。
import math
def count_prime1(N):
count = 0
for i in range(2, N+1):
is_prime = False
for j in range(2, int(math.sqrt(i))+1):
if i % j == 0 and i != j:
is_prime = True
break
if is_prime != True:
count += 1
return count
print(count_prime1(10000))
改进做法:
先定义一个长度了N+1的BOOL数组,其中用True填充,表示都是素数。
然后将2的倍数,3的倍数,5的倍数都改为False;
最后剩下的为True的就是所求的素数。
def count_prime(N):
judge_array = [True] * (N + 1)
for i in range(2, N+1):
for j in range(2, N//i+1):
judge_array[i*j] = False
count = 0
for i in range(2, N+1):
if judge_array[i] == True:
count += 1
return count
print(count_prime(10000))