给出一个正整数n,打印出所有从1~n的素数(即质数)
解法一
#include<stdio.h>
#include<math.h>
int main()
{ int i,n,x;
while(scanf("%d",&n)==1)
{ x=(int)sqrt(n);
for(i=2;i<=x;i++)
if(n%i==0) break;
if(i>x) printf("YES\n");
else printf("NO\n");
}
}
解法二
素数的倍数一定不是素数
for(int i=2;i<=n;i++)
{
if(prime[i]==0)
p[++tot]=i;
for(int j=i+i;j<=n;j+=i)
{
prime[j]==1;
}
}
或者
for(int i=2;i<=n;i++)
{
if(prime[i]==0)
{
p[++tot]=i;
for(int j=2;j*i<=n;j++)
{
prime[j*i]==1;
}
}
}
解法三(欧拉筛/线性筛
#include<stdio.h>
#include<string.h>
const int maxn=1e7+10;
bool a[maxn];
int b[maxn];
int k;
void pd(int n)
{
k=0;
int i,j;
memset(a,0,sizeof(a));
a[1]=1;
for(i=2;i<=n;i++)
{
if(a[i]==0)
b[k++]=i;
for(j=0;j<k&&b[j]*i<=n;j++)
{
a[i*b[j]]=1;
if(i%b[j]==0)
break;
}
}
}
int main()
{
int n,m,t,i;
scanf("%d%d",&n,&m);
pd(n);
for(i=0;i<m;i++)
{
scanf("%d",&t);
if(a[t]==0)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
素数打表
void dabiao()
{
for(int i = 2 ; i < N ; i++)
{
if(!b[i])
{
for(int j = i + i ; j <= N ; j += i)
b[j] = 1;
}
}
}