算法竞赛入门经典第1章【读书笔记】

虽然前四章内容比较基础,是作者给出了不少细节问题,值得全面学习一遍。

由于时间紧迫,所以先按照学习目标做一次学习。


第一章

【学习目标】

01熟练C语言程序的编译和运行(OK)

02学会编程计算并输出常见的算法表达式的结果(数学函数不熟悉)

03掌握整数和浮点数的含义和输出方法(对浮点数陷阱理解不够)

04掌握数学函数的使用方法(包括常用的哪些?)

05初步了解变量的含义(OK)

06掌握整数和浮点数变量的声明方法(OK)

07掌握整数和浮点数变量的读入方法(OK)

08掌握变量交换的三变量法(OK)

09理解算法竞赛中的程序三步曲:输入、计算、输出(OK)

10记住算法竞赛的目标及其对程序的要求(罗列一下)


01

编译应该用 gcc -Wall -g test.c -o test

其实我也不明白-Wall的真正功能,只是知道这样子可以加强检测,给更多警告让我们编写出更规范的程序

比如函数返回了一个int类型,但函数前面没有写明返回值类型,开启了-Wall之后编译时会得到警告:test.c:13: warning: return type defaults to 'int'


02

计算机中的towards zero,就是不管正负数计算结果总是朝0的方向靠近。

数据类型包括了数据集合和定义数据集合上的操作。所以同类型的数据类型四则运算肯定就是原来的类型。

而不同类型的,可以进行强制类型转换,或者隐式转换,比如4-3.14或者3.14-4,是先把4隐式转换成浮点数类型,然后进行浮点数之间的四则运算。

比如写成printf("%d\n", 4-3.14);就会警告第二个操作数了,而要写成"%lf"或“%f”。

顺便回顾下,"%10.2f"是指输出10个字节的长度(不足前面留空白,超过就超过)并且保留小数点后的2位有效数字。记忆模糊时测试一下便知!

include <math.h>中常用数学函数包括:

绝对值double fabs(double);三角函数double sin(double);反三角double asin(double);

开方double sqrt(double);求幂double pow(double a, double x)means a^x;求对数 (e为底)double log(double);(10为底)double log10(double)

取上整double ceil(double);取下整double floor(double); 这里上和下可以理解为取大和取小,比如-1.44,floor后是-2.0,ceil后是-1.0

注意abs()定义在<stdlib.h>中,当然自己宏定义一个也方便——abs(x) : ((x > 0) ? (x) : (-(x)))


03

整数类型和浮点数类型,可以近似理解为数学上的整数和实数。

历史的原因区分了float和double,现在基本上可以纯用double,不用float了。

注意:如果你的代码含有printf("lf\n", double(10));

gcc -pedantic编译时会提示ISO C90标准中printf()函数中没有"%lf",也就是说scanf()中区分"%f"和“%lf”,printf()中只有%f"" 了。


04数学函数的使用方法

还包括:const double pi = 4.0 * atan(1.0); // needs include <math.h>

05初步了解变量的含义(OK)

变量就是一个已经声明的具体的数据类型,它可以被赋值。比如int i; i = 100;

06掌握整数和浮点数变量的声明方法(OK)

int i; float j; double k;

07掌握整数和浮点数变量的读入方法(OK)

scanf("%d%f%lf", &i, &j, &k);

08掌握变量交换的三变量法(OK)

int i, j, tmp;

tmp = i;
i = j;
j = tmp;

09理解算法竞赛中的程序三步曲:输入、计算、输出(OK)

10记住算法竞赛的目标及其对程序的要求

目标只有一个,就是解决问题。而不看解决问题的方法,只看你能不能AC。当然比赛之余的学习应该适度注重算法和数据结构的优化,也注意不要过度优化。而像代码长度更不能过度要求自己,像《短码之美》就是典型的geek蛋疼之作,属于个人或小众兴趣范畴的研究了。(其实我也做过这种事情 - - ! 但不迷恋)

程序的要求包括:符合题目的输入输出要求,中间不暂停程序,主函数包括:int main() {return 0;}


第一章包括的例题:

圆柱体的表面积、三位数反转、交换变量、鸡兔同笼、三整数排序

对于三整数排序的第三个程序

#include <stdio.h>

int
main(void)
{
	int a, b, c, t;
	scanf("%d%d%d", &a, &b, &c);
	if (a > b) {
		t = a; a = b; b = t;
	}
	if (a > c) {
		t = a; a = c; c = t;
	}
	if (b > c) {
		t = b; b = c; c = t;
	}
	printf("%d %d %d\n", a, b, c);
	return 0;
}

其实就是作为后面循环结构中不断更新当前最大值的启蒙程序,里面留下一个疑问是检查顺序是否也可以。

首先a,b,c是除名字不同以外,没有其他任何区别,通过比较两次可以得到三个元素中的最小值,然后剩下的两个元素通过比较一次就可以得到两者中的“最”小值;因此其他顺序是可以的,只是输出时要按对应顺序。比如你的意图是更新b为最小,那么首先输出b。


你可能感兴趣的:(算法竞赛入门经典第1章【读书笔记】)