素数打表十分常见,处理大IO与大数时十分有效,这里记下两种筛法。
bool isprime(int a)
{
for (int i=2;i*i<=a;i++)
if (a%i==0) return false;
return true; //易于理解,只是时间复杂度很高
}
int prime[MAXN];
bool book[MAXN];//book数组就是标记哪些不是素数
int cnt=0;
void Era_prime(int n)
{
for(int i=2;i<=n;++i)
{
if(!book[i])
prime[cnt++]=i;
for(int j=i;j<=n;j+=i)
{
book[j]=true;
}
}
}
int prime[250000];
int cnt = 0;
bool num[2000000];
void get_prime(int n) {
for (int i = 2; i <= n; i++) {
if (!num[i]) {
prime[cnt++] = i;
}
for (int j = 0; j < cnt&&i*prime[j]<=n; j++)
{
num[i * prime[j]] = true;
if (i% prime[j] == 0) break;
}
}
}