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 |
做这到题首先要知道什么是素数:只能被1和自身整除的数,有两种判断方法:
1.用for循环,从2到n-1逐个求余,如果有被n整除的,则不是素数。
2.m 不必被2~m-1之间的每一个整数去除,只需被2~√m之间的每一个整数去除就可以了。如果 m 不能被2~√m 间任一整数整除,m必定是素数。例如判别17是是否为素数,只需使17被2~4之间的每一个整数去除,由于都不能整除,可以判定17是素数。原因:因为如果m能被2~m-1之间任一整数整除,其二个因子必定有一个小于或等于√m,另一个大于或等于√m。
还有这题容易出问题的是大小写,这里的OK,都是大写的,一定要注意,我就因为这个提交不上!
#include<stdio.h>
#include<math.h>
bool isprime(int n)
{
int a=1;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
a=0;
}
return a;
}
int main()
{
int x,y,k,n;
bool isprime(int);
while(scanf("%d %d",&x,&y)&&(x!=0 || y!=0))
{
for(int i=x;i<=y;i++)
{
n=pow(i,2)+i+41;
k=isprime(n);
if(k==0)
break;
}
if(k==1)
printf("OK\n");
else
printf("Sorry\n");
}
return 0;
}
运行结果: