线性筛素数——蒟蒻解说

线性筛

给出一个正整数n,求出1~n之内的所有素数。

解法:(纯属个人意见,欢迎大佬来虐)

说实话,我看不懂欧拉筛的原理......

但是在我的仔细琢磨下(发现了欧拉筛的精华)

没记错的话有个筛法叫什么埃及筛。就是一个素数的积绝对是一个合数废话),但是在这个筛法里发现会有些数字被重复筛了。

譬如说12 = 2(质数)* 6,但是同时12 = 3(质数)* 4。于是便被筛重复了,便会大大的增长时间。

代码:

那我们就想到了一个办法(欧拉筛)——只筛没有筛过的素数的积和埃及筛差不多,多了优化)。

模拟一下:

bool check[i] // 为判断i是否为一个素数
int prime[i] // 已经找到的第i个素数
首先把check全部附为1,表示都为质数。

然后走起:

从2开始找第一个素数(一定是二,不然就全筛掉了)。

发现2就是素数,存下来(prime[++tot] = i;)与当前的每一个素数开始相乘,它们的积为合数,所以check[i * prime[j]] = 0;

for(register int i = 2;i <= n;++i)
	{
		if(!check[i])
			pri[++tot] = i;
		for(register int j = 1;j <= tot && i * pri[j] <= n;++j)
		{
			check[i * pri[j]] = 1;
			if(i % pri[j] == 0) break;
		}
	}

发现当前只有2一个素数,就自己与自己相乘,check[2 * 2] = 0,4为合数。

继续找到3,再乘6,9为合数;找4,发现4为合数跳过,找5发现没有被标记过,与当前每个素数相乘,10,15标记为合数。

以此类推。。。

 

 

你可能感兴趣的:(线性筛素数——蒟蒻解说)