素数筛应该属于数论吧,其实并不难,只要理解了思路是很容易的写出来的,就是一个固定的模板。
比如说我们求1000以内的素数,这就需要一个数组,用来装下从2到1000的每个数字,然后我们把所有2的倍数的数字都划去,接下来是数字3,我们再把3的倍数的数字划掉,因为2,3,是素数,那么他们的倍数就一定不是素数,素数的定义是除了1和它本身不能被整除的数,以此类推,我们接着往下找,因为4是2的倍数,所以被划去了,接下来是5,我们把5的倍数存起来……以此类推。
接下来是一段素数筛的模板代码:
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
int a[1000];
int main()
{
a[0] = 0;
a[1] = 0;
for(int i=2;i<1000;i++)
{
a[i] = i;
}
for(int i=2;i<sqrt((double)1000);i++)
{
if(a[i]!=0)
{
for(int j = i*2;j<1000;j+=i)
{
a[j] = 0;
}
}
}
int count = 0;
for(int i=2;i<1000;i++)
{
if(a[i]!=0)
{
printf("%d ",a[i]);
count++;
}
}
printf("\n");
printf("%d\n",count);
return 0;
}
运行的结果是:
在素数筛中主要的代码是这一段: