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
思路分析:
首先,输入x、y是一个范围,也就是【x,y】之间,已知题意,它有一个表达式n=n2+n+41,这里的n属于【x,y】范围内。
第一步,需要将通过表达式计算之后的n给求出来,判断其是否是素数。(本人编写一个自定义函数来进行判断n是否是素数,若是素数返回0,不是返回1)
第二步,对最后的结果进行分类总结即可
代码如下:
#include<stdio.h>
#include<math.h>
int is(int n);int main(){int sum,i,j,k,n;int x,y;while(scanf("%d %d",&x,&y)!=EOF){if(x==0&&y==0)break;//输入0 0 表示结束for(i=x;i<=y;i++){n=i*i+i+41;if(is(n))break;//如果返回的是1,代表不是素数}if(i>y)printf("OK\n");//再进行判断,若i>y表示是循环完整结束,即为素数else printf("Sorry\n");//循环不正当结束,表示之间有不是素数的数存在}return 0;}int is(int n){//自定义判断是否是素数的函数,若是素数返回0,否则返回1int i;if(n%2==0)return 1;//偶数都不是素数,返回1int x = sqrt(n);//这里是为了减少运算量for(i=3;i<=x;i+=2){//这里的i=i+2,是因为偶数都不是素数,不需要判断了,第一个if里面已经筛选过了if(n%i==0)break;//存在有其他数可以被它整除,即不是素数,结束循环,即该数不是素数}return i > x ? 0 : 1;//当循环结束之后,存在两种情况,一种是进入if中,结束循环、;另一种则是,循环完整结束;如果i>x表示循环完整结束,也就是说从3~√n之间都不可以被它整除,即它是素数,则返回0;反之返回1;
参考博客:https://blog.csdn.net/tigerisland45/article/details/51761340