求素数我们最开始接触的就是普普通通的用概念,除了1和本身不能被其他数整除,那就一个for循环一个个试试,后面对他有了优化,我们发现循环进行到sqrt(n)就可以了,代码如下:
bool isPrime(int x) {
for (int i = 2; i * i <= x; ++i) {
if (x % i == 0) {
return false;
}
}
return true;
}
int countPrimes(int n) {
int ans = 0;
for (int i = 2; i < n; ++i) {
ans += isPrime(i);
}
return ans;
}
后面我们又学习了埃式筛,思路就是我们知道2是素数这一个前提,筛去2的倍数,那么后面的第一个没被筛掉的一定是素数,那就筛掉这个数的倍数,以此类推,上代码
int countPrimes(int n) {
int ans=0;
vector<int> a(n, 1);
for(int i=2;i<n;i++){
if(a[i]==1){
ans+=1;
if((long long)i*i < n){
for(int j=i*i;j<n;j+=i){
a[j]=0;
}
}
}
}
return ans;
}
接下来我们发现这种方法会重复计算,就有了线性筛,但是一般不做要求,