zoukankan      html  css  js  c++  java
  • 素数判定 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
    ");
            else
                printf("Sorry
    ");
        }
        return 0;
    }

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

     

    我想要变得高一点,最好能伸手给你一片天。
  • 相关阅读:
    animation关键帧动画语法
    border-image
    CSS3之box-shadow
    border-radius编程练习1-3
    CSS之border-radius
    CSS3之径向渐变
    CSS3之线性渐变(linear gradients)
    CSS之background——背景与渐变练习题
    background-image
    background-color
  • 原文地址:https://www.cnblogs.com/cattree/p/7485821.html
Copyright © 2011-2022 走看看