总结了3种求素数表的方法
第一种:
void intline()
{
memset(prime,true,sizeof(prime));
prime[1]=false;
prime[0]=false;
for(int i=2; i*i<MAXN; i++)
{
for(int j=2; j*i<MAXN; j++)
prime[j*i]=false;
}
}
第二种:与第一种原理相似,也是这个题用到的方法,但是这种是用int开的数组,prime[i]=j表示i的最大素数因子是第j个素数,2是第一个素数),所以说这种求法有很多的变形。
void intline()
{
int num=0;
memset(prime,0,sizeof(prime));
for(int i=2;i<MAXN;i++)
{
if(!prime[i])
{
num++;
for(int j=i;j<MAXN;j+=i)
prime[j]=num;
}
}
}
第三种:就是最普通的方法了
int isprime(int n)
{
for(int i=2; i*i<=n; i++)
if(n%i==0) return 0;
return 1;
}
第四种:其实和第二种一样,是第一种的变形,这个prime[i]=j表示第i个素数是j
void intline()
{
memset(num,0,sizeof(num));
num[0]=num[1]=1;
int cnt=0;
for(int i=2; i*i<MAXN; i++)
{
if(!num[i])
{
prime[cnt++]=i;
for(int j=2; j*i<MAXN; j++)
num[j*i]=1;
}
}
}
这个题代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 1000001
using namespace std;
int prime[MAXN];
void intline()
{
int num=0;
for(int i=2;i<MAXN;i++)
{
if(!prime[i])
{
num++;
for(int j=i;j<MAXN;j+=i)
prime[j]=num;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
intline();
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",prime[n]);
}
return 0;
}