统计所有小于非负整数 n 的质数的数量。 (前三个我写的[其实就以前看过]超时了,后面自己想吧)
class Solution(object):
def countPrimes1(self, n):
"""
:type n: int
:rtype: int
"""
if n <= 2:
return 0
primes_list = [2]
# 根据一条定理,可以被指数整除的数一定不是指数,反推出如果不被被质数整除则是质数
for i in range(3, n, 2): # 这里从三开始,同时步长为2表示跳过偶数
if i > 10 and (i % 4 != 3 and i % 4 != 1):
continue
flag = False
for item in primes_list:
if i % item == 0:
flag = True
break
# 其中有一个规律,一个质数就可以找到整除他的数的范围是小于自己的开方范围数,超过这个数则表示没有
if item + 1 > i ** 0.5:
break
if not flag:
primes_list.append(i)
return len(primes_list)
def countPrimes2(self, n):
"""
:type n: int
:rtype: int
"""
if n <= 2:
return 0
primes_list = [2]
# 根据一条定理,可以被指数整除的数一定不是指数,反推出如果不被被质数整除则是质数
for i in range(3, n, 2): # 这里从三开始,同时步长为2表示跳过偶数
if i > 10 and (i % 4 != 3 and i % 4 != 1):
continue
flag = False
for item in primes_list:
if i % item == 0:
flag = True
break
# 其中有一个规律,一个质数就可以找到整除他的数的范围是小于自己的开方范围数,超过这个数则表示没有
if item + 1 > i ** 0.5:
break
if not flag:
primes_list.append(i)
return len(primes_list)
def countPrimes3(self, n):
"""
:type n: int
:rtype: int
"""
if n <= 2:
return 0
count = 1
for i in range(3, n, 2):
if i > 10 and (i % 4 != 3 and i % 4 != 1):
continue
flag = False
for j in range(3, int(i ** 0.5) + 1, 2):
if i % j == 0:
flag = True
break
if not flag:
count += 1
return count
def countPrimes4(self, n):
"""
埃氏筛: 请看力扣官网
:type n: int
:rtype: int
"""
if n <= 2:
return 0
is_prime = [1] * n
ans = 1
for i in range(3, n, 2):
if is_prime[i] == 1:
ans += 1
if i * i < n:
j = i * i
while j < n:
is_prime[j] = 0
j += i
return ans
def countPrimes(self, n):
"""
线性筛: 请看力扣官网
:type n: int
:rtype: int
"""
prime_list = [2]
is_prime = [1] * n
for i in range(3, n, 2):
if is_prime[i] == 1:
prime_list.append(i)
for k in range(len(prime_list)):
if i * prime_list[k] < n:
is_prime[i*prime_list[k]] = 0
if i % prime_list[k] == 0:
break
else:
break
return len(prime_list)
if __name__ == '__main__':
s1 = Solution()
start = time.time()
print(s1.countPrimes(1500000))
print(time.time() - start)