您的位置:首页 > 其它

HDU 2012 素数判定(素数)

2014-11-16 15:50 369 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: