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

發佈了733 篇原創文章 · 獲贊 159 · 訪問量 85萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章