两种方法做的,首先是线性筛法,代码如下:
#include<iostream>
#include<stdio.h>
#include<string.h>
#define maxn 50010
using namespace std;
bool visited[maxn];
int prime[maxn];
int num;
void isprime()
{
num=0;
memset(visited,true,sizeof(visited));
memset(prime,0,sizeof(prime));
for(int i=2; i<=maxn; i++)
{
if(visited[i])
prime[num++] = i;
for(int j=0; j<num && prime[j]*i<=maxn; j++)
{
visited[prime[j]*i] = false;
if(i%prime[j] == 0)
break;
}
}
}
int main(){
isprime();
int n;
while(scanf("%d",&n)!=EOF)
{
if(n == 1)
printf("NO\n");
else if(visited[n])
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
第二种是普通的埃拉托斯尼斯筛法,代码如下:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 50010
typedef long long LL;
bool isprime[N];//bool放前面
LL prime[N];//必须声明为long long
int num;
void dopprime()
{
LL i,j;
memset(isprime,true,sizeof(isprime));
num = 0;
isprime[1] = false;
for(i=2;i<=N;i++)
{
if(isprime[i])
{
prime[++num] = i;
for(j=i*i;j<=N;j+=i)
isprime[j] = false;
}
}
}
int main()
{
int n;
dopprime();
while((scanf("%d",&n))!=EOF)
{
if(n == 1)
printf("NO\n");
else if(isprime[n])
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
第二种有几点声明一下:
1.prime数组必须声明为long long型,否则会崩
2.bool的isprime数组必须放前面,原因不知道,但是和“nefu 2 猜想”里的总结是一致的