筛素数-线性筛法(考研复试上机知识点)

平常我们使用筛素数的时候,只需要使用欧拉筛法(线性筛法)就行了,因为复杂度是为
O(n)的,而且比较好写。
代码:
 

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

void get_prime(int n)
{
	for(int i=2;i<=n;i++)
	{
        //如果没有被筛过那么就是素数。
		if(!st[i])prime[cnt++]=i;
        //枚举每一个素数
		for(int j=0;prime[j]<=n/i;j++)
		{
            //把它的倍数(合数)都筛掉
			st[prime[j]*i]=true;
            
			if(i%prime[j]==0)break;
		}
	}
}
比如i=12,此时素数数组中有素数2,3,5,7,11
2*12=24,把24筛除了,但是判定12可以整除2,2是12的最小素因子(是因子,且是素数因子),所以此时循环退出。

因为12*3=36这个结果可以通过12的最小素因子2,以其他方式得到。36这个结果,当x=18时可以通过18*2得到,
同样的,后面的素数*12得到结果,也可以通过另外的x与2相乘得到。比如12*5=60,可以通过30*2得到。
因此每个合数只被其最小的素因子筛除,不会被其他素因子筛除,因此欧拉筛中每个合数只会被筛除一次,不会被重复筛除。

你可能感兴趣的:(计算机考研复试上机题,算法,数据结构,c++)