传送门:1106 质数检测
解题思路
根据质数的定义,在判断一个数n是否是质数时,我们只要用1至n-1去除n,看看能否整除即可。但我们有更好的办法。先找一个数m,使m的平方大于n,再用<=m的质数去除n(n即为被除数),如果都不能整除,则n必然是质数
。如我们要判断1993是不是质数,50*50>1993,那么我们只要用1993除以<50的质数看是否能整除,若不能即为质数.
AC代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const long long MAXN = 1e5+5;
bool visit[MAXN+5];
long long prime[200055];
int num ; //区间内素数的个数
void init_prim()
{
memset(visit, true, sizeof(visit));
for (int i = 2; i <= MAXN; ++i)
{
if (visit[i] == true)
{
num++;
prime[num] = i;
}
for (int j = 1; ((j <= num) && (i * prime[j] <= MAXN)); ++j)
{
visit[i * prime[j]] = false;
if (i % prime[j] == 0) break; //点睛之笔
}
}
}
int main()
{
init_prim();
int t;
scanf("%d",&t);
while(t--)
{
long long n;
scanf("%lld",&n);
int tmp = sqrt(n)+1;
int p=lower_bound(prime,prime+num,tmp)-prime;
bool flag = false;
for(int i=1;i<=p;i++)
{
if(!(n%prime[i]) && n!=2)
{
flag = true;
break;
}
}
if(!flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}