1暴力解法
def prime_number_count(num):
count = 1 # 因为从3开始计算,2是素数,所以count初始为1
for i in range(3, num):
if not i % 2:
continue
flag = True
for j in range(2, i):
for m in range(2, i):
if m * j == i:
flag = False
break
if flag:
count += 1
return count
2 暴力优化 (用 x%i ==0来判断是否是素数,并且只比较到根号x)
def prime_number_count2(num):
count = 1 # 因为从3开始计算,2是素数,所以count初始为1
for i in range(3, num):
if not i % 2:
continue
flag = True
for j in range(2, math.floor(math.sqrt(i)) + 1):
if i % j == 0:
flag = False
if flag:
count += 1
return count
3 埃氏筛选
'''利用素数和非素数的概念,得到一个素数之后,任何数 * 这个素数都是非素数,将列表中这些不是非素数的置为True'''
def era_number(num):
count = 0
bools = [True for _ in range(num)] # 初始默认所有的值都是素数,与[1,2,3,4......num]一一对应
for item in range(2, num):
if bools[item]: # 如果当前遍历的值是素数
count += 1
for j in range(item * 2, num, item): # 这里表示这个素数*n n从2开始递增,其结果在num之内
# 可以优化成 item*item 因为 item=2会将2*3,2*4....都置为True,就不用比较4*2了,以4为点,应该从4*4开始比较
bools[j] = False
return count
PS:埃氏筛选才是这道题的考点,也是面试题中考官希望听到的解法