51Nod-1106-质数检测

给出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 5000
int 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!!!很多时候,必须承认自己是弱鸡。

全部评论

相关推荐

11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务