51nod 1106 质数检测

来源:互联网 发布:淘宝订单导出不一样 编辑:程序博客网 时间:2024/06/05 08:25

传送门: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;}
0 0