Hay dos tipos de números primos de tamiz

Introducir dos método tamiz

Los primeros: Eratóstenes (de Eratóstenes) tamiz
abreviatura: normal Eppendorf tamiz o pantalla

complejidad del tiempo: O (nloglogn)

Ambas versiones de la siguiente tamiz ordinario y optimización

Escrito 1:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int a[N];
void ss(int n){
	memset(a,-1,sizeof(a));//a[i]=-1 先假定所有数都为素数,i是素数a[i]=-1,不是素数a[i]=0 
	a[0]=a[1]=0;
	for(int i=2;i<=n;i++)
		if(a[i])
		for(int j=i*2;j<=n;j+=i) a[j]=0; //从i*2,开始以他自身为倍数相加的数都是合数 
}
int main(){
	int n;
	while(cin>>n){
		ss(n); 
		for(int i=2;i<=n;i++)
			if(a[i]) cout<<i<<endl;
	}
} 

Escritura 2: ciclo puede durar para su nueva redacción
esencia de la misma.

void ss(int n){
	memset(a,-1,sizeof(a));
	a[0]=a[1]=0;
	for(int i=2;i<=n;i++)
		if(a[i])
		for(int j=2;j*i<=n;j++) a[i*j]=0; 
}

Dos optimización en el código.

void ss(int n){
	memset(a,-1,sizeof(a));
	a[0]=a[1]=0;
	for(int i=2;i<=sqrt(n);i++)//优化1:只需要到sqrt(n) 
		if(a[i])
		for(int j=i*i;j<=n;j+=i) a[j]=0; //j从i*i开始 
}

El segundo: método tamiz de Euler.

complejidad Tiempo: O (n)
principios y pantalla general similar, pero a la duplicación evitar del mismo número de mallas unida
en el código de abajo

const int N=1e5;
bool a[N];
void Ess(int n){
	 memset(a,true,sizeof(a));
	 int p[N],cnt=0;
	 for(int i=2;i<=n;i++)
	 {
	 	if(a[i]) p[cnt++]=i;
	 	for(int j=0;j<cnt&&i*p[j]<=n;j++)//每个合数只用其最小质因数去筛 
	 	{
	 		a[i*p[j]]=false;
	 		if(i%p[j]==0) break; 
		}//如果i能被p[j]整除,说明i*p[j+1]已经被筛过,因为i是p[j]的倍数,所以i*[p+1]是p[j]的倍数 
	 } 
} 

Tenga en cuenta que los dos anteriores métodos de cribado 1 tienen juez especial,
si no están sujetas a una serie de necesidades especiales será condenado a 1

Después de leer lo anterior dos métodos de criba Prime: ir a Los Valle practicar su parte,
el título Portal: Título de la plantilla

Publicado 18 artículos originales · alabanza ganado 14 · vistas 365

Supongo que te gusta

Origin blog.csdn.net/weixin_45750972/article/details/103950601
Recomendado
Clasificación