题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=582
解题方案:本题范围为1e5,可以直接用基本法或筛法,这里用两者双排的方法,大概可以解决范围上界为1e14的素数判定。
定理:如果 n 是一个合数,则
n 必有小于或等于 sqrt(n) 的素因子。
证明:记
n
为一个合数,首先根据算术基本定理(即正整数的唯一分解定理:每个大于1的自然数均可写为素数的积),可知
代码如下,复杂度近似O(1e7)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define FOR(i,k,n) for(int i=k;i<n;i++)
#define FORR(i,k,n) for(int i=k;i<=n;i++)
#define scan(a) scanf("%d",&a)
#define scann(a,b) scanf("%d%d",&a,&b)
#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define mst(a,n) memset(a,n,sizeof(a))
#define ll long long
#define N 1005
#define mod 1000000007
#define INF 0x3f3f3f3f
const double eps=1e-8;
const double pi=acos(-1.0);
const int maxn=1e7;
bool isprime[maxn];//10MB
int prime[maxn];//40MB
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
mst(isprime,true);
isprime[1]=false;
int cnt=0;
for(int i=2;i<maxn;i++)
{
if(isprime[i])
{
prime[cnt++]=i;
for(int j=i+i;j<maxn;j+=i)
isprime[j]=false;
}
}
ll n;
while(cin>>n)
{
if(n==1)
{
cout<<"NO"<<endl;
continue;
}
int flag=1;
for(int i=0;prime[i]<=sqrt(n);i++)
{
if(n%prime[i]==0)
{
flag=0;
break;
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}