学习笔记:筛质数

1、埃氏筛

const int N = 1e6+5;

bool vis[N];
int prime[N],cnt; //数组存质数

void get_prime(int x) //获取1~x内的质数
{
    
    
	for(int i=2;i<=x;i++)
	{
    
    
		if(!vis[i]) //如果该数没有被筛掉,说明它是质数
		{
    
    
			prime[cnt++]=i;//加入质数表
			for(int j=i+i;j<=x;j+=i)	vis[j]=1;//将它的所有倍数筛掉
		}
	}
}

int main()
{
    
    
	int n;
	cin>>n;
	get_prime(n);
	cout<<cnt<<endl;
	return 0;
}

2、线性筛

const int N = 1e6+5;

bool vis[N];
int prime[N],cnt;

void get_prime(int x)
{
    
    
    for(int i=2;i<=x;i++)
    {
    
    
        if(!vis[i]) prime[cnt++]=i; //加入质数表
        for(int j=0;prime[j]<=x/i;j++)
        {
    
    
            vis[prime[j]*i]=1; //prime[j]一定是prime[j]*i的最小质因子
            if(i%prime[j]==0)   break;
        }
    }
}

int main()
{
    
    
	int n;
	cin>>n;
	get_prime(n);
	cout<<cnt<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_50815157/article/details/113760453
今日推荐