这个素数的打表方法接近n.
#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 10005
using namespace std;
bool vis[maxn];
int prime[maxn];
//素数的线性打表
void Clear()
{
memset(vis,0,sizeof(vis));
int num = 0;
vis [1] = 1;
//素数倍数全部标记
for(int i = 2;i<maxn;i++)
{
if(!vis[i])
{
prime[++num] = i;
}
for(int j = 1;j<=num&&i*prime[j]<maxn;j++)
{
vis[prime[j]*i] = 1;
if(i%prime[j]==0) break;//避免重复的出现 例如 5*9 3*15
}
}
}
int main()
{
Clear();
//素数前100个素数
for(int i = 1;i<=100;i++)
{
printf("%4d",prime[i]);
if(i%5==0) printf("\n");
}
return 0;
}