首页 > 代码库 > HDU 2012 素数判定(素数)

HDU 2012 素数判定(素数)

HDU 2012 素数判定(素数)

http://acm.hdu.edu.cn/showproblem.php?pid=2012

题意:水题一枚

       对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。

分析:

       本题的数据范围很小,求出表达式在-39到50内的所有可能值可以得到下面的数:

1523 1447 13731301 1231 1163 1097 1033 971  911

853  797 743  691  641 593  547  503 461  421

383  347 313  281  251 223  197  173 151  131

113  97  83   71   61  53   47   43  41   41

43   47  53   61   71  83   97   113 131  151

173  197 223  251  281 313  347  383 421  461

503  547 593  641  691 743  797  853 911  971

1033 1097 11631231 1301 1373 1447 1523 1601 1681

1763 1847 19332021 2111 2203 2297 2393 2491 2591

最大的数为2591,所以我们只要求出3000范围内所有素数,然后每次求出表达式范围值,判断都是否素数即可。

       当然本题更快的方法是预处理所有可能的数,看上面矩阵中哪些是素数,哪些不是素数,然后直接对于范围x,y输出结果。

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=3000;

//生成素数表
bool flag[maxn+5];//flag[i]==true表i为素数
int prime[maxn+5];
int get_prime()
{
    for(int i=2;i<=maxn;i++)
    {
        if(prime[i]==0)
        {
            flag[i]=true;
            prime[++prime[0]]=i;
        }
        for(int j=1;j<=prime[0] && prime[j]<=maxn/i;j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        }
    }
    return prime[0];
}

//计算公式的值
int compute(int x)
{
    return x*x+x+41;
}

//判断范围内是否都为素数
bool check(int a,int b)
{
    for(int i=a;i<=b;i++)
        if(!flag[compute(i)]) return false;
    return true;
}

int main()
{
    get_prime();
    int a,b;
    while(scanf("%d%d",&a,&b)==2)
    {
        if(a==0&&b==0) break;
        printf("%s\n",check(a,b)?"OK":"Sorry");
    }
    return 0;
}

HDU 2012 素数判定(素数)