《算法竞赛入门经典 第2版》知识点总结
1.整数 - 浮点数 = 浮点数。
2.圆周率表示:const double pi = acos(-1.0)。(其中"acos"为求反余弦)。注:尽量用const关键字声明常数。
3.在算法竞赛中,不要使用头文件conio.h,包括getch()、clrscr()等函数。
4.在算法竞赛中,每行输出均应与回车符结束,包括最后一行。输出的每两个数或者字符串之间应与单个空格隔开。
5.如果有多个并列、情况不交叉的条件需要一一处理,可以用else if语句。
6.建议尽量缩短变量的定义范围。例如,在for循环的初始化部分定义循环变量。
7.目前几乎在所有的比赛平台上,int都是32位整数。
8.因为只要末6位,所以输出时对10的6次方取模。
9.scanf("%d, &x)的输入格式:空格、TAB和回车符都是无关紧要的,按Enter键并不意味着输入的结束。
10.如何将程序输入结束:在windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再按Enter键,即可输入结束。
在Linux下,输入完毕后按Ctrl+D键即可结束输入。
11."scanf("%s",s)"会读入一个不含空格、TAB和回车符的字符串,它遇到空白字符会停下来。
12.变量在为赋值之前的值是不确定的。特别地,它不一定等于0。
13.在算法竞赛中,常常难以精确计算出需要的数组大小,数组一般会声明得稍大一些。在空间够用的前提下,
浪费一点不会有太大影响。
14.比较大的数组应尽量声明在main函数外,否则程序可能无法运行。
15.数组不能够进行赋值操作。(数组a = 数组b,错误)
16.如果要从数组a复制k个元素到数组b:memcpy(b,a,sizeof(int)*k)。如果数组a和b都是浮点型,复制时要写成"memcpy(b,a,sizeof(double)*k)"。如果需要把数组a全部复制到数组b中:memcpy(b,a,sizeof(a))。另外,使用memcpy函数要包含头文件string.h。
17.memset(a,0,sizeof(a))的作用是把数组清零,在string.h中定义。
18.空字符"\0"是C语言中字符串的结束标志。
19.在语法上可以把字符当作int型使用。
20.printf输出到屏幕,fprintf输出到文件,sprintf输出到字符串(包含在头文件string.h中)。
注意:应保证字符串足够大,可以容纳输出信息。
21.strchr的作用是在一个字符串中查找单个字符。包含在头文件string.h中。
22.C语言中的字符串是以"\0"结尾的字符数组,可以用strlen(s)返回字符串s中结束标记之前的字符个数。
字符串中的各个字符是s[0],s[1],…,s[strlen(s)-1]。
23.由于字符串的本质是数组,它也不是“一等公民”,只能用strcpy(a,b),strcmp(a,b),strcat(a,b)来执行“赋值”、“比较”和“连接”操作,而不能用"="、"=="、"<="、"+"等运算符。上述函数都在string.h中声明。
24.滥用"++"、"--"、"+="等可以修改变量值的运算符很容易带来隐蔽的错误。建议每条语句最多只用一次这种运算符,并且所修
改的变量在整条语句中只出现一次。
举例:
#include<stdio.h>
int main()
{
int count = 0;
printf("%d %d %d\n",count++,count++,count++);
return 0;
}
运行结果:
解释:unspecificed行为,在函数的多个参数里多次改变同一个变量的值,其改变的顺序是没定义的,可能从前往后算,也可能从后往前。即:对count的运算可能是没有定义的。
解决方法:可以利用编译器减少这种错误。用-Wall命令编译,编译器会发出警告。
25.函数floor(x)返回不超过x的最大整数。所在头文件:#include <math.h>。
26.使用fgetc(fin)可以从打开的文件fin中读取一个字符。一般情况下应当在检查它不是EOF后再将其转换成char值。从标准输入读取一个字符可以用getchar,它等价于fgetc(stdin)。
27.“fgets(buf,maxn,fin)”将读取完整的一行放在字符数组buf中。应当保证buf足够存放下文件的一行内容。除了在文件结束前没有遇到“\n”这种特殊情况外,buf总是以“\n”结尾。当一个字符都没有读到时,fgets返回NULL。标准输入版:gets(s)。
28.2 ^ 8 - 1用C语言表示:(1<<8) - 1。注意:括号是必需的,因为“<<”运算符的优先级没有减法高。
29.为了使用方便,往往用“typedef struct { 域定义; }类型名;”的方式定义一个新类型名。这样,就可以像原生数据类型一样使用这个自定义类型。
用法举例:
①“struct 结构体名称{ 域定义; };”:
struct Point{double x, y;};
double dist(struct Point a, struct Point b)
{
return hypot(a.x - b.x, a.y - b.y);
}
②“typedef struct { 域定义; }类型名;”:
typedef struct{double x, y;}Point;
double dist(Point a, Point b)
{
return hypot(a.x - b.x, a.y - b.y);
}
上一篇: 高精度运算