1. 程式人生 > >204. 計數質數

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])