素数判定 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!
我想要变得高一点,最好能伸手给你一片天。