204. 計數質數
阿新 • • 發佈:2018-12-31
質數的性質:
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])