素数筛,顾名思义就是要筛去合数,留下素数,达到预处理的效果
基本思路:把从1开始的,某一范围内的正整数从小到大顺序排列,1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。
上代码之前,配上一道洛谷的题P1865 A % B Problem:点击这里
就是一道素数筛的裸题!!!(配上前缀和使用更美味)
附上本人的解题报告:
上代码:
#include <cstdio>
#include <iostream>
using namespace std;
int f[10000005];
void fp()//这是一个英文名,find_prime哈哈哈哈
{
f[1]=1;//1不是素数,所以特判
for(int i=2;i<=n;i++)
for(int j=2;j*i<=n;j++) //从某个数的2倍开始删,保留这个数本身
f[j*i]=1;
}
int main()
{
int n;
cin>>n;fp();
for(int i=2;i<=n;i++)
if(f[i]) cout<<i<<" ";
return 0;
}
END