线性筛
给出一个正整数n,求出1~n之内的所有素数。
解法:(纯属个人意见,欢迎大佬来虐)
说实话,我看不懂欧拉筛的原理......
但是在我的仔细琢磨下(
发现了欧拉筛的精华)。没记错的话有个筛法叫什么埃及筛。就是一个素数的积绝对是一个合数(
废话),但是在这个筛法里发现会有些数字被重复筛了。譬如说12 = 2(质数)* 6,但是同时12 = 3(质数)* 4。于是便被筛重复了,便会大大的增长时间。
代码:
那我们就想到了一个办法(欧拉筛)——只筛没有筛过的素数的积(
和埃及筛差不多,多了优化)。模拟一下:
首先把check全部附为1,表示都为质数。bool check[i] // 为判断i是否为一个素数 int prime[i] // 已经找到的第i个素数
然后走起:
从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标记为合数。
以此类推。。。