Encuentra el número de números primos en un cierto intervalo

Directorio de artículos

Tamiz de codo

Encuentra el número de números primos menores que el entero n.

int prime[MAX_N];// 存储素数
bool is_prime[MAX_N];//表示第i个数是否为素数
int sieve(int n){
    
    
	int p=0;
	for(int i=0;i<=n;i++) is_prime[i]=true;
	is_prime[0]=is_prime[1]=false;
	for(int i=2;i<=n;i++){
    
    
		if(is_prime[i]){
    
    
			prime[p++]=i;
			for(int j=2*i;j<=n;j+=i) is_prime[j]=false;
		}
	}
	return p;
}

Tamiz de intervalo

Encuentre el número de números primos en el intervalo cerrado izquierdo y derecho cerrado [a, b).
Idea: Primero encuentra [2, b \ sqrt bsegundo ) En los números primos, y luego extraiga estos números del intervalo objetivo.

typedef long long ll;

bool is_prime[MAX_L];
bool is_prime_small[MAX_SQRT_B];

void segment_sieve(ll a,ll b){
    
    
	//初始化
	for(int i=0;(ll)i*i<b;i++) is_prime_small[i]=true;
	for(int i=0;i<b-a;i++) is_prime[i]=true;
	
	//枚举小区间里的数
	for(int i=2;(ll)i*i<b;i++){
    
    
		if(is_prime_small[i]){
    
    
			//筛小区间
			for(int j=2*i;(ll) j*j<b;j+=i) is_prime_small[j]=false;
			//筛大区间
			for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i) is_prime[j-a]=false;
		}
	}
}

Supongo que te gusta

Origin blog.csdn.net/DwenKing/article/details/108103596
Recomendado
Clasificación