[读书笔记]《算法竞赛入门经典》第1章
书名:算法竞赛-入门经典 第2版
作者:刘汝佳
类别:读书笔记
文章目录
- 前言
- 第1章 程序设计入门
- 1.1 算术表达式
- 1.2 变量及其输入
- 1.3 顺序结构程序设计(Sequential Program)
- 1.4 分支结构程序设计(Branching)
- 1.5 注解与习题
- 1.5.1 C语言、C99、C11 以及其他
- 1.5.2 数据类型与输入格式
- 1.5.3 习题
前言
前言之中比较重要的是作者对整本书的架构安排:
- 第一部分是语言篇(第1-4章)
- 第二部分是算法篇(第5-8章)
- 第三部分是竞赛篇(第9-11章)
- 全新的第12章是在《算法竞赛入门经典----训练指南》的基础上补充少量知识与大量精彩例题
第1章 程序设计入门
1.1 算术表达式
#include <stdio.h>
#include <math.h>int main(int argc, const char * argv[]) { printf("%d\n", 1+2);return 0;}
Experiment 1 - 4:
Expression | output |
---|---|
1+2 | 3 |
3-4 | -1 |
5*6 | 30 |
8/4 | 2 |
8/5 | 1 |
-8/5 | -1 |
此处需要注意整数相除可能会有 Truncation 的现象出现。
#include <stdio.h>
#include <math.h>int main(int argc, const char * argv[]) { printf("%1f\n", 8.0/5.0);return 0;}
Experiment 5 - 7:
Statement | output |
---|---|
printf("%.1f\n", 8.0/5.0)
|
1.6 |
printf("%.2f\n", 8.0/5.0)
|
1.60 |
printf("%.1f\n", 8/5)
|
0.0 |
printf("%d\n", 8.0/5.0)
|
-272632504 |
尽管已经学过C很久了,我也没有想到实验7居然会得出这个结果,这是为什么呢?
Learning Points:
- Output integers by %d, output real numbers by %f
*f stands for floating point - Integer/Integer = Integer; Floating Point/ Floating Point = Floating Point
1.2 变量及其输入
Learning Points:
语法相关:
- How to read keyboard input?
scanf 中的占位符(例如%d, %f)和变量应该一一对应,而且每个变量之前必须要加“&”。 - 尽量用const 声明常数。
竞赛相关:
- 在竞赛当中,输入前不要打印提示信息,输出后应该立即终止程序。
- 每一行输出都应该以回车符 \n 结束,包括最后一行。除非特别说明,行首不应该有空格。
有关赋值(Assignment) 和 printf 函数的使用不再赘述。
1.3 顺序结构程序设计(Sequential Program)
如何交换两个变量(swapping)?
- 三变量法
- 算术法 (第8页程序1-9)
- 直接输入输出
Learning Points:
竞赛相关:
- 可以用手工模拟的方式理解程序的执行方式,那么模拟的具体写什么呢?重点在于记录每条语句执行之后各个变量的值。
1.4 分支结构程序设计(Branching)
Learning Points:
语法相关:
- if 语句的基本格式为 (只有一条语句时,花括号“{ }”可以省略):
if (condition) {statement 1;... } else {statement 2.... }
condition
可以是逻辑表达式(logical expression) 也可以是整数值。注意condition是整数值的时候,0=false
, 其他值=true
。- 如果有多个并列、情况不交叉的
condition
需要一一处理,可以用else if 语句。 - 注释可以使用
//
或者/* */
竞赛相关:
- 在竞赛当中,我们设计的程序应该对任何输入都有效,而不仅仅是样例数据。Make sure program works beyond given test cases.
1.5 注解与习题
1.5.1 C语言、C99、C11 以及其他
C语言标准:设计之初是为了防止同样的程序被不同的编译器编译成截然不同的指令
读者需要注意的是,应当把前4章的内容当成是在学习C++当中与C相兼容的部分。
1.5.2 数据类型与输入格式
#include <stdio.h>
#include <math.h>int main(int argc, const char * argv[]) {int a = 11111*11111;printf("%d\n", a);return 0;
}
注:下列所有实验的输出当中,printf 函数中的占位符统一与变量a相匹配。
int a
-> printf("%d\n", a);
double a
-> printf("%.1f\n", a);
实验 | expression | output | remarks |
---|---|---|---|
A1.1 |
int a = 11111*11111
|
123454321 | |
A1.2 |
int a = 111111*1111111
|
-539247567 | overflow in expression |
A1.3 |
int a = 111111111*111111111
|
1653732529 | overflow in expression |
A2.1 |
double a = 11111*11111
|
123454321.0 | |
A2.2 |
double a = 111111*111111
|
-539247567.0 | overflow in expression |
A2.3 |
double a = 111111111*111111111
|
1653732529.0 | overflow in expression |
A3.1 |
double a = sqrt(-11)
|
nan | 系统没有报错 |
A3.2 |
int a = sqrt(-11)
|
-2147483648 | 系统没有报错 |
A4.1 |
double a = 1.0/0.0
|
inf | |
A4.2 |
double a = 0.0/0.0
|
nan | |
A4.3 |
int a = 1.0/0.0
|
-272632320 | |
A4.4 |
int a = 0.0/0.0
|
-272632320 | |
A5.1 |
int a = 1/0
|
-272632320 | Division by zero is undefined |
A5.2 |
double a = 1/0
|
0.0 | Division by zero is undefined |
从上列实验可以观察出:
int
和double
都不可以处理较大的数- 在做不正确的计算时,
double
时常会返回nan
(not a number) 或者inf
(infinity)
#include <stdio.h>
#include <math.h>int main(int argc, const char * argv[]) {int a, b;scanf("%d%d", &a, &b);printf("%d %d\n", a ,b);return 0;
}
实验 | input | output | remarks |
---|---|---|---|
B1 | 12 2 | 12 2 | 空格分离 |
B2 | 12 2 | 12 2 | 12 2 不同行 |
B3 | 12 2 | 12 2 | 12 和 2 前面后面有大量空格、tab、甚至空行 |
B4.1 | 12 s | 12 0 | 空格分离 |
B4.2 | 12 s | 12 0 | 12 2 不同行 |
B4.3 | 12 s | 12 0 | 12 和 2 前面后面有大量空格、tab、甚至空行 |
1.5.3 习题
本章习题过于简单,不再赘述。
[读书笔记]《算法竞赛入门经典》第1章相关推荐
- 算法竞赛入门经典第3章
3.1数组 数组较大 比较大的数组尽量声明在main函数外,否则程序可能无法进行. 数组操作 如果要从数组a复制k个元素到数组b,可以这样做:memcpy(b,a,sizeof(int)*k). 如 ...
- 《算法竞赛入门经典》第一章1.5
1.5.4 问题1 问题2 问题3 问题4 问题5 最邻近的else 转载于:https://www.cnblogs.com/LzKlyhPorter/p/4185828.html
- 算法竞赛入门经典 第七章 总结
目录: 7.1 简单枚举 7.2 枚举排列 7.3 子集生成 7.1 简单枚举 例题7-1 除法(Division, UVa 725) 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij ...
- 算法竞赛入门经典 第五章总结1
例题1: 输入多行数据,每行包含若干个以空格隔开的整数,输出每行中所有整数之和 #include<iostream> #include<string> #include< ...
- 算法竞赛入门经典第六章(例题) B - Rails(涉及到栈的运用)
题目:B - Rails 原题链接:https://cn.vjudge.net/contest...: 题目大意:先输入一个表示火车的节数,火车原本是按从1到n的顺序,但是一起进的还是分开进的是不一定 ...
- 《算法竞赛入门经典》 第二章 循环结构程序设计 习题
注:这里为了便于测试,直接使用stdin,stdout进行输出,没有进行文件读写操作. 习题2-1 位数(digit) 输入一个不超过10^9的正整数,输出它的位数.例如12735的位数是5.请不要使 ...
- 刘汝佳算法竞赛入门经典第三章习题
/*给出一些容易理解的解题方法 但是没有oj评测 所以无法保证一定正确 矩阵的旋转给出了左旋和右旋 不确定题目3-5是哪一种*/ 习题3-1分数统计(stat) 输入一些学生的分数,哪个分数出现的 ...
- 《算法竞赛入门经典》第一章习题答案
习题1-1 平均数(average) 输入3个整数,输出它们的平均值,保留3位小数. #include <stdio.h> int main() { int a,b,c; scanf(&q ...
- 算法竞赛入门经典第4章 【uvaoj习题(一)】
题目合集 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=94 uva100 ...
最新文章
- vscode使用教程python-使用VS Code开发Python
- 翻译器DIY它———算在英文文本中的单词数,字符和行数
- Linux 父进程 子进程 回收,回收 fork() 的子进程
- html head
- k 最近邻_k最近邻与维数的诅咒
- NSNumber, NSValue的使用
- 【23】数据可视化:基于 Echarts + Python 动态实时大屏范例 - Redis 数据源
- fisheye calib视野调整
- Y-我的PPT监控之流媒体服务器的搭建
- C++11的右值引用、移动语义(std::move)和完美转发(std::forward)详解
- 在Ubuntu12.04部署OpenStack (1)
- Visual Studio 快速统一设置项目属性(以VS2017为例)
- java 设计模式 常用21种
- 【深度学习-机器学习】分类度量指标 : 正确率、召回率、灵敏度、特异度,ROC曲线、AUC等
- 2018新版个税计算器---Python实现
- 【AirPlay2开发】协议整合
- Android-Application被回收引发空指针异常分析(消灭全局变量)
- python 条形图填充疏密_Python数据分析 4:图表绘制工具Matplotlib
- 连接HC-05与HC-06
- eclipse相关介绍