埃式筛法
计算整数区间[2,n]中的所有素数的最为简便的筛法——埃拉托斯特尼筛法(The Sieve of Eratosthenes):
设u[]为筛子,初始时区间中的所有数在筛子u[]中。按递增顺序搜索u[]中的最小数,将其倍数从u[]中筛去,最终筛中留下的数即为素数。
时间复杂度:O(n * log log n)
代码:
#include <iostream> //埃式筛法
#include <cstdio> //时间复杂度:O(n * log log n)
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int maxm = 50;
int p[maxm];
bool vis[maxm];
int num = 1;
void Prime()
{
memset(vis,true,sizeof(vis));
for(int i = 2 ; i <= maxm ; i++)
{
if(vis[i])
{
for(int j = 2 ; j <= maxm ; j++)
{
if(j*i > maxm)
break;
vis[j*i] = false; //把i的倍数全部筛去
}
}
}
for(int i = 2 ; i <= maxm ; i++)
{
if(vis[i])
p[num++] = i;
}
}
void Output()
{
for(int i = 1 ; i < num ; i++)
{
cout << p[i] << " ";
if(i % 5 == 0)
cout << "\n";
}
}
int main()
{
Prime();
Output();
return 0;
}