51Nod-1106-质数检测

来源:互联网 发布:Python程序sleep 编辑:程序博客网 时间:2024/06/10 22:56

给出N个正整数,检测每个数是否为质数。如果是,输出”Yes”,否则输出”No”。
Input
第1行:一个数N,表示正整数的数量。(1 <= N <= 1000)
第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9)
Output
输出共N行,每行为 Yes 或 No。
Input示例
5
2
3
4
5
6
Output示例
Yes
Yes
No
Yes
No

遇见这道题,我第一感觉又是个坑,不搞些小手段一定会超时,但是怎么才能不超时呢?传统的因子检测法是肯定行不通的,结果一查吓我一跳,又是费马检测,又是AKS质数测试,一堆看得不是太懂的概念性东西,充斥着荧屏,硬着头皮看了一天也只是懵懵懂懂,然后我再一次念叨那句话,作为一个程序员,如果你给我数学公式的话,那还不如给我代码去学习。

于是我就上网找到了一个不错的代码,仔细一看,这个代码并没有用上边说的那两个特别复杂的检测思路,而是利用了传统的因子检测,但是它优化了很多,利用质因子检测的原理,成功的节省了大量的时间,效率有显著的提升,鉴于个人能力有限(数学真的挂了),我暂时先用这种质因数的检测来AC吧,毕竟舍本逐末的事太消耗时间,还不一定能够弄透彻……

#include <stdio.h>#define _MAX 5000int a[_MAX + 1] = {1,1};int p[_MAX + 1];int main(){    int num = 0;    for(int i = 2; i <= _MAX; i++)    {        if(!a[i])            p[num++] = i;        for(int j = 0; j < num && i * p[j] <= _MAX; j++)        {            a[i * p[j]] = 1;            if(!(i % p[j]))                break;        }    }    int t, n;    scanf("%d", &t);    while(t--)    {        scanf("%d", &n);        if(n <= _MAX)        {            if(!a[n])            {                printf("Yes\n");            }            else            {                printf("No\n");            }        }        else        {            int ok = 1;            for(int i = 0; i < num; i++)            {                if(n % p[i] == 0)                {                    ok = 0;                }            }            if(ok)            {                printf("Yes\n");            }            else            {                printf("No\n");            }        }    }    return 0;}

OVER!!!很多时候,必须承认自己是弱鸡。

0 0
原创粉丝点击