素数判定 hdu 2012

 

Problem Description

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

 

Input

输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。

 

Output

对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。

 

Sample Input

0 1 0 0

 

Sample Output

OK

 

Author

lcy

 

题解

       找素数,没啥好说的,一个数不是素数就是合数。

 

       按照很容易想到的的方法来说;是这样的:

 

    int num = 0;
    for(i=2; i<=n; i++)
    { 
        for(j=2; j<=sqrt(i); j++)
         if( j%i==0 ) 
             break;
         if( j>sqrt(i) )
              prime[num++] = i; 
     }

 

    但是很费时间,复杂度是o(n*sqrt(n)),数据范围很大的话就出不来了。所以,可以用素数筛选法

具体做法是

    先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,

而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。

3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,

就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。在纸上自己画画。

 

 

 AC代码(用了筛选法):

 

#include<iostream>
#include<cstdio>
using namespace std;
bool math[2600];
void once()
{
    for(int i=2;i<=2600;i++)
    {
        math[1]=false;
        math[2]=true;
        if(i%2==1)
            math[i]=true;
        else 
            math[i]=false;
    }
}

void judge()
{
     for(int i=3;i<=51;i+=2)
      {   if(math[i])
          for(int j=i+i;j<=2600;j+=i)
              math[j]=false;
      }
}

int main()
{
    int x,y;
    while(cin>>x>>y,x||y)
    {
        if(x<=0&&y<=0)
        {
            int t=-x;
            x=-y;
            y=t;
        }
        if(x<=0&&y>=0&&-x>=y)
        {
            int t=-x;
            x=1;
            y=t;
        }
        if(x<=0&&y>=0&&-x<=y)
            x=1;
        once();
        judge();
        int ans=0;
        for(int i=x;i<=y;i++)
        {
            int result=i*i+i+41;
            if(math[result])
            {
                ans++;
            }
        }
        if(ans==y-x+1)
            printf("OK\n");
        else
            printf("Sorry\n");
    }
    return 0;
}

今天也是元气满满的一天,good luck!

 

posted @ 2017-09-06 17:08  ikefire  阅读(268)  评论(0编辑  收藏  举报