【leetcode】204. 计数质数

质数的性质:

  1. 对于一个数x,只需对[2,这里写图片描述]的数进行整除,若能整除则不是素数,不能整除则为素数。(maybe超时)。
  2. 一个合数必然能分解成质因子之积。因此我们每当找到一个素数,设它为 i,那么对于2∗i,3∗i,4∗i,....,n。2∗i,3∗i,4∗i,....,n这些数来说肯定都是合数。删掉!

so 只需遍历[2,这里写图片描述],因为超过这里写图片描述部分如果不是素数,则在前面的因子的倍数(cur_value)已经被删除了。

利用了python里list的特性[::i]取i的倍数。

解1--性质1:

def countPrimes(self, n):
    # 超时
    count = 0
    if n <= 1:
        return 0
    for num in range(2,n):
        count+=self.judgePrimes(num)
    return count

def judgePrimes(self,n):
    tmp = int(n ** 0.5) + 1
    for i in range(2, tmp):
        if n % i == 0:
            return 0
    return 1

解2--性质2:

class Solution(object):
##
# 2. 一个合数必然能分解成质因子之积。因此我们每当找到一个素数,设它为 i,
# 那么对于2∗i,3∗i,4∗i,....,n。2∗i,3∗i,4∗i,....,n这些数来说肯定都是合数。删掉!

# so 只需遍历[2,sqrt(n)],因为超过部分如果不是素数,则在前面的因子的倍数(cur_value)已经被删除了。
    def countPrimes(self, n):
        if n < 3:
            return 0
        primes = [True]*n
        # print(primes) # [True, True, True, True]
        primes[0] = primes[1] = False
        for i in range(2,int(n**0.5)+1):
            # if primes[i]: # 每当找到一个素数,ture
                # 素数的倍数都是合数
            # print(i) # i: 2,3,4,5...
            # primes[i*i:n:i] == [True, True, True]
            # [::i]取i的倍数
            primes[i*i:n:i]=[False]*len(primes[i*i:n:i])
            # ValueError: attempt to assign sequence of size 1 to extended slice of size 3
        # print(primes)
        # [False, False, True, True, False, True, False, True, False, False]
        return sum(primes)

对于:primes[i*i:n:i]=[False]*len(primes[i*i:n:i])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值