筛质数一般有两种方法:埃氏筛法、线性筛法,一般用线性筛法,更快
埃氏筛法:把所有质数的倍数筛掉
线性筛法:让所有合数被他的最小质因数筛掉
如3*7=21,

  • 埃氏筛法21被3和7分别操作一次
  • 线性筛法21只被3操作一次
埃氏筛法:(洛谷IDE)
时间复杂度n*ln(n)
查找1~1e7约200ms,内存11mb
查找1~1e8(>2000s)报超时
线性筛法:(洛谷IDE)
查找1~1e7约160ms ,内存12mb;
查找1~1e8约1210ms,内存121mb
#include <bits/stdc++.h>

using namespace std;

int n;
const int N=1000006;
int prime[N],cnt=0;
bool st[N];//质数是FALSE,合数是TRUE 
void getPrime(){
    for(int i=2;i<=n;i++){
        if(!st[i]) prime[cnt++]=i;//如果是质数就放进prime里 
        for(int j=0;prime[j]<=n/i;j++){//不需要j<cnt,因为
				//如果i是质数下面if中i 会被i自己除掉(上句话i是质数会被放入
				//如果i是合数下面的if中i会i被最小质因数除掉break,i的质因数小于他自己,所以循环到i是他的质因数已经被记入
				// prime[j]<=n/i是为了防止下面 st[i*prime[j]]里面的东西越界 
            st[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
    return;
}

int main(int argc, char** argv) {
    cin>>n;
    getPrime();
    cout<<cnt<<endl;
	return 0;
}