素数筛1

1.朴素for(int i=1; i*i <= n; i++) if(n % i == 0) return 0; return 1
2.埃氏筛 筛掉大部分数的倍数,从x*x开始

点击查看代码
void prime(int n)
{
	memset(v,0,sizeof(v));
	for(int i=2; i<=n; i++)
	{
		if(v[i])是素数;
		for(int j=1; j<=n/i; j++) v[ i*j ] = 1;
	}
}
3.线性筛 防止多次标记:在出现一个合数a时,把a乘上自己的最小质因子,类似质因数的积累
点击查看代码
void prime(int n)
{
	memset(v,o,sizeof(v));//最小质因子
	int m=0;//质因子数量
	for(int i=2;i<=n;i++)
	{
		if(v[i]==0)
		{
			//是素数
			prime[++m]=i;
			v[i]=i;
		}
		for(int j=1;j<=m;j++)
		{
			//i有比prime更小的质因子,或大于n
			if(prine[j]>v[i] ||prime[j]>n/i)
				break;//prime[j]是合数i*prime[j]的最小质因子
			v[i*prime[j]]=prime[j];
		}
	}
}
posted @ 2021-11-16 21:52  fervency  阅读(26)  评论(0编辑  收藏  举报