1 条题解

  • 0
    @ 2025-10-10 19:52:15

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1000010;
    int primes[N],cnt;
    bool f[N];//标记是否是素数
    
    //朴素的素数筛 时间复杂度:O(n*log2n) 
    void get_primes(int n){
    	for(int i = 2;i <= n;i++){
    		//如果是素数 
    		if(!f[i]){
    			primes[cnt++] = i;
    		}
    		
    		for(int j = i + i;j <= n;j = j + i){
    			f[j] = true;
    		}
    	}
    } 
    
    //优化版本:只需要将2~p-1之间的质数的倍数标记为非素数
    //时间复杂度O(nloglogn) 
    //埃筛 
    void get_primes2(int n){
    	for(int i = 2;i <= n;i++){
    		//如果是素数 
    		if(!f[i]){
    			primes[cnt++] = i;
    			for(int j = i + i;j <= n;j = j + i){
    				f[j] = true;
    			}
    		}
    	}
    }  
    
    //埃筛再优化 
    void get_primes3(int n){
    	cnt = n - 1;
    	for(int i = 2;i * i <= n;i++){
    		//如果是素数 
    		if(!f[i]){
    			for(int j = i + i;j <= n;j = j + i){
    				if(!f[j]){
    					f[j] = true;
    					cnt--; 
    				}
    			}
    		}
    	}
    } 
    
    //线性筛
    //原理:n只会被最小质因子筛选掉,所有的合数一定被筛掉 
    void get_primes4(int n){
    	for(int i = 2;i <= n;i++){
    		if(!f[i]) primes[cnt++] = i;
    		for(int j = 0;primes[j] <= n / i;j++){
    			f[primes[j] * i] = true;
    			//primes[j]是i的最小质因子,也就一定是primes[j]*i的最小质因子 
    			if(i % primes[j] == 0) break;
    		} 
    	}
    } 
     
    int main() {
    	int n;
    	cin>>n;
    	get_primes4(n);
    	cout<<cnt;
    	return 0;
    }
    
    
    • 1

    信息

    ID
    1054
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者