题目:
计算n以内的素数个数。
解题思路:
1、首先考虑直接判断n以内的每个数是否为素数。再对结果进行求和。判断某个数是否为素数的方法,之间判断该数能否整除从2到sqrt(n)的数字。若能则是素数,否则不是素数。复杂度为n*sqrt(n)。但在LeetCode会超时。
代码(Python):
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
if n==0:
return 0
def IsPrime(n):
sqrt_n = int(n**0.5)
for i in range(2,sqrt_n+1):
if (n%i)==0:
return 0
return 1
count = 0
for i in range(2,n):
count+=IsPrime(i)
return count
2、改变判断某数是否为素数的方式,判断该数能否整除从2到sqrt(n)的素数。在LeetCode也会超时
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
Prime = []
flag = 0
for i in range(2,n):
if Prime==[]:
Prime.append(i)
continue
for j in range(len(Prime)):
if Prime[j]*Prime[j]>i:
flag = 0
break
if i%Prime[j]==0:
flag = 1
break
if flag==1:
flag = 0
continue
else:
Prime.append(i)
return len(Prime)
3、在网上查找到的解题思路,降低了复杂度。厄拉多塞筛法。可以AC
链接:http://blog.csdn.net/github_39261590/article/details/73864039
代码(Python):
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
if n<2:
return 0
output = [True]*(n-1)
output[0:1] = [False]*2
sqrt_n = int(n**0.5+1)
for i in range(sqrt_n):
if output[i]:
output[i*i:n:i]=[False]*len(output[i*i:n:i])
return sum(output)