9 条题解

  • 2

    埃氏筛

    首先将 22nn 范围内的整数写下来。

    其中 22 是最小的素数。将表中所有的 22 的倍数划去。

    表中剩下的最小的数字就是 33 ,他不能被更小的数整除,所以 33 是素数。

    再将表中所有的 33 的倍数划去……

    以此类推,如果表中剩余的最小的数是 mm,那么 mm 就是素数,然后将表中所有m的倍数划去,像这样反复操作,就能依次枚举 nn 以内的素数。

    时间复杂度:O(nloglogn)O(n \log \log n)

    code

    #include<bits/stdc++.h>
    using namespace std;
    bool vis[1000005];
    void prime(int n){
    	vis[0]=vis[1]=0;//0和1不是质数
    	for(int i=2;i<=n;i++){//从2枚举
    		if(vis[i])//如果i是质数
    			for(int j=2*i;j<=n;j+=i)//那么枚举它的倍数
    				vis[j]=0;//j不是质数
    	}
    }
    int main(){
    	int n;
    	cin>>n;
    	memset(vis,true,sizeof(vis));
    	prime(n);
    	cout<<(vis[n]?"yes":"no");
    }
    

    信息

    ID
    91
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    78
    已通过
    35
    上传者