素数和质数傻傻分不清楚,厄拉多塞筛法

自己总是搞混素数和质数,傻傻分不清楚
答案是:他们是一样的,只是叫法不同。

厄拉多塞筛法到底是什么呢?
是在西元前 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值