【LittleXi】计数质数
题目描述
给定整数 N ,返回 所有小于非负整数 N 的质数的数量 。
204. 计数质数
P3912 素数个数
解题思路
埃拉托斯特尼筛法
计算每个数字的时候将素数的倍数标记一下
# 8112ms
class Solution:
def countPrimes(self, n: int) -> int:
cnt=0
f=[1]*n
for i in range(2,n):
if f[i]:
cnt+=1
j=1
while i*j<n:
f[i*j]=0
j+=1
return cnt
欧拉筛
优化版本,在标记素数的时候,已经重复标记的不再标记
#python版本超时
class Solution:
def countPrimes(self, n: int) -> int:
prime=[0]*(n+1)
vis=[1]*n
for i in range(2,n):
if vis[i]:
vis[i]=0
prime[0]+=1
prime[prime[0]]=i
for j in range(1,prime[0]+1):
if i*prime[j]>n:
break
if i*prime[j]<n:
vis[i*prime[j]]=0
if i%prime[j]==0:
break
return prime[0]
//cpp版本272ms
class Solution {
public:
int countPrimes(int n) {
int vis[5000010] = {
0 };
int prime[5000010] = {
0 };
for (int i = 2; i < n; i++)
{
if (vis[i] == 0)
{
vis[i] = 1;
prime[++prime[0]] = i;
}
for (int j = 1; prime[j] * i <= n &&j <= prime[0]; j++)
{
vis[i * prime[j]] = 1;
if (i % prime[j]==0)
break;
}
}
return prime[0];
}
};