自己总是搞混素数和质数,傻傻分不清楚
答案是:他们是一样的,只是叫法不同。
厄拉多塞筛法到底是什么呢?
是在西元前 250 年,希腊数学家厄拉多塞(Eeatosthese)想到了一个非常美妙的质数筛法,减少了
逐一检查每个数的的步骤,可以比较简单的从一大堆数字之中,筛选出质数来,这方法被称作厄拉多塞筛法(Sieve of Eeatosthese)。
他的具体操作:先将 2~n 的各个数放入表中,然后在 2 的上面画一个圆圈,然后划去 2 的其他 倍数;第一个既未画圈又没有被划去的数是 3,将它画圈,再划去 3 的其他倍数;现在既未 画圈又没有被划去的第一个数 是 5,将它画圈,并划去 5 的其他倍数……依次类推,一直 到所有小于或等于 n 的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些 数正好就是小于 n 的素数。
其实,当你要画圈的素数的平方大于 n 时,那么后面没有划去的数都是素数,就不用继续
判了。
从上面的厄拉多塞筛法可以看出,我们只需遍历[2, √n],因为超过√n 部分如果不是素数,
习题:计数质数
统计所有小于非负整数 n 的质数的数量。
#方法一
def countPrimes(n):
import math
def is_prime(num):
if num == 1:
return False
for i in range(2,int(math.sqrt(num))+1):
if num%i == 0:
print("num的值是:%s"%num)
print("--------------------------------------")
return False
return True
counter = 0
for i in range(2,n):
if is_prime(i):
print("i的值是:%s"%i)
counter += 1
return counter
print("10",countPrimes(10))
#print("999983",countPrimes(999983))
运行结果
i的值是:2
i的值是:3
num的值是:4
--------------------------------------
i的值是:5
num的值是:6
--------------------------------------
i的值是:7
num的值是:8
--------------------------------------
num的值是:9
--------------------------------------
10 4
#方法二
def countPrimes(n):
if n < 3:
return 0
res = [True] * n #占n个坑
res[0] = res[1] = False # n最小是3
for i in range(2,int(10**0.5)+1):
if res[i]:
print("i的值是:%s"%i)
res[i*i:n:i] = [False] * len(res[i*i:n:i])# i的平方-n之间,每隔i取。赋值为False
print(res[i*i:n:i],len(res[i*i:n:i]))
return sum(res)#False=0
print("10",countPrimes(10))
运行结果:
i的值是:2
[False, False, False] 3
i的值是:3
[False] 1
10 4