1.穷举法判别素数
int main()
{
int n,i;
scanf("%d",&n);
for(i=2;i<sqrt(n); ++i)
if(n%i==0)
break;
if(i<=sqrt(n)||n==1)
printf("NO\n");
else
printf("YES\n");
return 0;
}
适用于判断单个数是否为素数和小数据的情况。
2.筛选法求素数
bool not_prime[1005];
int prime[1005];
int tot;
void Prime(int n)
{
for(int i=2;i<=n;++i)
{
if(!not_prime[i])
{
prime[tot++]=i;
for(int j=i*i;j<=n;j+=i)
not_prime[j]=true;
}
}
}
缺点:存在重复筛选合数,效率降低。例如合数30=2*15;30=5*6,存在类似的重复筛选。
3.快速线性筛选素数
int is_not_prime[100000001];
int prime[10000001];
int num_prime;;
void Prime(int n)
{
for(int i=2; i<=n; ++i)
{
if( !is_not_prime[i])
prime[num_prime++]=i;
//关键处1
for(int j=0; j<num_prime&&prime[j]*i<=n; ++j)
{
is_not_prime[prime[j]*i]=1;
if(!(i%prime[j]))//关键处2
break;
}
}
}
关键处1:不管i是否为素数,都会进行到下一步。
关键处2:bao保证不重复筛选,直观的样例
i=2*3,这是可以将 i*2 筛除,同时停止,不能继续筛选 3*i,存在i'=3*3,可以将3*i筛除。
结论:
每个数不会重复筛选
合数一定能筛选出来
点这里 直观图