C语言学习记录(9)素数判定

c语言学习记录

前言

一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流!

不当之处请斧正!在此感谢!这边就先从学习C语言写起,自己本身对程序语言方面不擅长,所以决定对此从基础开始学习,

大牛们对此文可以忽略!

学校OJ上的C语言作业

素数判定

题目描述
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x 输入描述
输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。
输出描述
对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。
输入样例
0 1
0 0
输出样例
OK

解题:

标准版:大部分人都知道的比较快的方法:判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n))

高配版:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时间复杂度O(sqrt(n)/2)

为什么结束标志我一直这样打会输出超限或时间超限?

while(scanf("%d %d",&x,&y)&& (x!=0 || y!=0))
{
}

《ACM基本输入输出》 规定了
3、输入第三类:
输入不说明有多少个Input Block,但以某个特殊输入为结束标志。
例如:

Sample input
1 5
10 20
0 0
Sample output
6
30
#include <stdio.h>
int main(){ 
int a,b;
while(scanf("%d %d",&a, &b) && (a!=0 || b!=0))
printf("%d\n",a+b);
} 

把代码换成

while(~scanf("%d %d",&x,&y))
{
if(x==0&&y==0)break;
}

就立马正确了!(我都错了30次了好嘛)

正确答案:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[]) {
	int x,y,i,n,s;
	while(~scanf("%d %d",&x,&y))
	{
		if(x==0&&y==0)break;
		if(x>=-39&&x<y&&y<=50)
		{
			int flag=1;
			while(x<=y)
			{
				n=x*x+x+41;
				
				if(n%2==0 || n<2)
				{
					flag=0;
					break;
				}
				else
				{
					for(i=3;i<=sqrt(n);i+=2)
					{
						s=sqrt(n);
						if(n%i==0)
						{
							flag=0;	
							break;
						}
					}
				}
				if(flag==0)
				{
					break;	
				}   
				x++; 
			}
			if(flag)
			{
				printf("OK\n");
			}
			else
			{
				printf("Sorry\n");
			}
		}

	}
	return 0;
}

你可能感兴趣的:(C语言)