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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值