c语言学习记录
前言
一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流!
不当之处请斧正!在此感谢!这边就先从学习C语言写起,自己本身对程序语言方面不擅长,所以决定对此从基础开始学习,
大牛们对此文可以忽略!
学校OJ上的C语言作业
素数判定
题目描述
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
输入描述
输入数据有多组,每组占一行,由两个整数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;
}