计算机程序设计竞赛-第1讲

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中山大学新华学院
主要内容
算法——程序设计的灵魂 经典算法 简单的数据结构知识
1 2 3
1.1 什么是算法
一个程序应包括两个方面的内容: • 对数据的描述:数据结构(data structure) • 对操作的描述:算法(algorithm) 数据结构 + 算法 = 程序 数据结构+算法+程序设计方法+语言工具
输出 year 闰年
1.4 算法的表示
用伪代码表示算法 概念:
伪代码是用介于自然语言和计算机语言之间的文字和符
号,用来描述算法。
特点:
如一篇文章,自上而下地写下来。每一行(或几行)表示 一个基本操作。它不用图形符号,因此书写方便 、格式紧 凑,也比较好懂,也便于向计算机语言算法(即程序)过渡 。
1.4 算法的表示
例5: “打印x的绝对值” ,用伪代码表示算法。
用英文伪代码表示:
IF x is positive THEN print x ELSE print -x
也可以用汉字伪代码表示:
若 x为正 打印 x
打印 -x
也可以中英文混用,如:
IF x print x ELSE print -x
1.4 算法的表示
流程图的连接点举例


② ③ ③
位置 不够
防止 交叉


1.4 算法的表示
流程图表示三种基本结构
顺序结构
A
B
1.4 算法的表示
流程图表示三种基本结构
选择结构 Y N Y N
p
p
A
B
A
1.4 算法的表示
流程图表示三种基本结构
循环结构
p1 Y A
Nቤተ መጻሕፍቲ ባይዱ
A N p2 Y
1.4 算法的表示
算法
广义地说,为解决一个问题而采取的方法和步骤,称为“算法”。
对同一个问题,可以有不同的算法。
计算机算法可分为两大类别:
数值运算算法,目的是求数值解。 非数值运算算法,包括的面十分广泛,最常见的是用于事务管理领 域。
注意:
写出了C程序,仍然只是描述了算法,并未实现算法。 只有运行程序才是实现算法。
当型循环结构
直到型循环结构
1.4 算法的表示
N-S流程图( N-S图) 由I. Nassi和Shneiderman提出的新的流程图形式,称为 N-S流程图。其三种基本结构的N-S图表示:
A Y
p
N B A
当p1成立 A
循环结构 (当型)
A 直到p2成立 循环结构 (直到型)
B
顺序结构
选择结构
1.4 算法的表示
算法是解决“做什么”和“怎么做”的问题。即是为 解决一个问题而采取的方法和步骤。
1.2 简单算法举例
步骤1:先求1×2,得到结果2
步骤2:将步骤1得到的乘积2再乘以
3,得到结果6 步骤3:将6再乘以4,得24
步骤4:将24再乘以5,得120
1.2 简单算法举例
何为算法
“烧水泡茶”有如下五道工序: 1、烧开水2、洗茶壶3、茶杯4、拿茶叶5、泡茶。 烧开水、洗茶壶、茶杯,拿茶叶是泡茶的前提。其中烧开水需要15分 钟,洗茶壶需要2分钟,洗茶杯需要1分钟,拿茶叶需要1分钟,泡茶需 要1分钟。 下面是两种“烧水泡茶”的方法。 方法1: 第一步:烧水; 第二步:水烧开后,洗刷茶具,拿茶叶; 第三步:沏茶。 方法2: 第一步:烧水; 第二步:烧水过程中,洗刷茶具,拿茶叶; 第三步:水烧开后沏茶。
一般使用while循环实现。枚举算法一般按照如下三个步骤进行。
(1)题解的可能范围,不能遗漏任何一个真正解,也要避免有重复。 (2)判断是否是真正解的方法。 (3)使可能解的范围降至最小,以便提高解决问题的效率。
2.1 经典算法——枚举法
使用枚举算法解题的基 本思路如下所示。 (1)确定枚举对象、枚
1.3 算法的特性
有穷性 一个算法应包含有限的操作步骤,而不能是无限的。 确定性 算法中的每一个步骤都应当是确定的,不能含糊。 输入 输出
有零个或多个输入,从外界获取必要信息。 有一个或者多个输出,得到问题的解。
有效性 每一个步骤有效执行,得到确定的结果。
1.4 算法的表示
算法的表示
自然语言
2.经典算法
九大大算法思想
枚举算法思想 递推算法思想 递归算法思想 分治算法思想 贪心算法思想 试探法算法思想 迭代算法思想 动态规划算法思想 模拟算法思想
2.1 经典算法——枚举法
比较笨的枚举算法思想
枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件
判断此答案是否合适,保留合适的,丢弃不合适的。在C语言中,枚举算法
计算机程序设计竞赛
信科系专职教师:赵小蕾
邮箱:zxl_xinhua@163.com
课程介绍及要求
课程类别:全校公选课 总学时数:36(实操课) 开课目的:为信息科学系——竞赛项目:第六届“蓝 桥杯软件人才与设计大赛”培养人才。
主要培养学生解决实际问题的编程能力、培养学生的
创新思维。程序是自己设计出来的,而不是某个固定 的方程式。
1.5 算法复杂度的分析
算法的复杂性越高,所需的计算机资源越多。 最重要的计算机资源是时间资源与空间资源。 需要计算机时间资源的量称为时间复杂度,需要计算机空 间资源的量称为空间复杂度。 时间复杂度与空间复杂度集中反映算法的效率。
1.5 算法复杂度的分析
一个算法的时间复杂度是指算法运行所需的时间。
一个算法的运行时间取决于算法所需执行的语句(运算)的
多少。 算法的时间复杂度通常用该算法执行的总语句(运算)的数 量级决定。
1.5 算法复杂度的分析
算法的执行频数的数量级直接决定算法的时间复杂 度。
1.5 算法复杂度的分析
(1) x=x+1; s=s+x; 2个语句各执行1次,共执行2次。时间复杂度为O(1)
(2)恒心、演练、举一反三
学习编程的过程是枯燥的过程,我们需要将学习算法当成是自己的乐趣
,只有做到持之以恒才能有机会学好。另外编程最注重实践,最害怕闭门造车
。每一个语法,每一个知识点,都要反复用实例来演练,这样才能加深对知识 的理解。并且要做到举一反三,只有这样才能对知识的深入理解。
(3)语言之争的时代更要学会坚持
算法用N-S图表示,如右图。
1 i
输入ni、gi i+1i 直到i>50
练习:使用流程图表示算法。

1 i
gi≧80 否
输出ni,gi
i+1i 直到i>50
1.4 算法的表示
例3 流程图如下:
开始
Y 1 i 输出ni、gi 输入ni、gi i+1i N i>50 N i+1i i>50 Y gi≧80 N
例6:求5!用C语言表示。
N-S图为:
1 t
2 i
当i<=5
t*it
i+1i 输出t
#include <stdio.h> int main( ) { int i,t; t=1; i=2; while(i<=5) { t=t*i; i=i+1; } printf(″%d\n″,t); return 0; }
year是闰年
结束
Y
1.4 算法的表示
例4 判定2000 - 2500年中的每一年是否闰年,并将结果输出 。
2000year 是 是 year%100不为0 是 输出year 闰年 year%400为0 输出year 非闰年 year+1year 直到year>2500 year%4为0 否 否 输出 year 非闰年 否
// 统计解的个数
2.1 经典算法——枚举法
举例:完美综合式
案例提出:
把数字1,2,...,9这9个数字分别填入以下含加、减、乘、除
与乘方(^)的综合运算式中的9个□中
□^□+□□÷□□-□□×□=0 要求数字1,2,...,9这9个数字在式中出现一次且只出现一次, 且约定数字“1”不出现在乘、乘方的一位数中。
1.5 算法复杂度的分析
算法的空间复杂度是指算法运行的存储空间,是实现算 法所需的内存空间的大小。 一个程序运行所需的存储空间通常包括固定空间需求与
可变空间需求两部分。
1. 固定空间需求包括程序代码、常量与静态变量等所占 的空间。 2. 可变空间需求包括局部作用域非静态变量所占用的空 间、从堆空间中动态分配的空间与调用函数所需的系
“t=1”与“k=1”各执行1次;“k<=n”与“k++”各执行n次;“t=t*2”执行n次; “j=1”执行n次;“j<=t”、“j++”与内循环的赋值语句“s=s+j”各执行频数为: 总的执行频数为:
1.5 算法复杂度的分析
在估算算法的时间复杂度时,为简单计,以后只考虑内循环 语句的执行频数,而不细致计算各循环设计语句及其它语句的执 行次数,这样简化处理不影响算法的时间复杂度。 例1-4 估算以下程序段所代表算法的时间复杂度。 for(k=1;k<=n;k++) for(j=1;j<=k;j++) { x=k+j; s=s+x;} 每个赋值语句执行频率为n(n+1)/2, 该算法的时间复杂度 为:O(n^2)
1.4 算法的表示
例4 判定2000 - 2500年中的每一年是否闰年,并将结果输出 开始 。
2000year year不能被4整除 N
year不能被100整除
Y year不是闰年 Y
year不能被400整除
N
Y year是闰年 year+1year year>2500 N
N
year不是闰年

1 i

Y
结束
1.4 算法的表示
例4 判定2000 - 2500年中的每一年是否闰年,并将结果输出 。 year不能 闰年的条件:
被4整除 能被4整除,但不能被100整除的年份 非闰年 都是闰年,如2008、2012、2048年。 闰年 能被400整除的年份是闰年, year被 year被4整 100 整除, 如2000年。 除,但不 又能被 能被100整 400整除 除 闰年 逐渐缩小判 其他 断的范围 非闰年
开始
例2 求1×2×3×4×5:即求5!的N-S图算法表示:
1 t 2 i t*it i+1i 直到i>5
N 1t 2i
VS
t*it i+1i
输出t
N-S图 结束
i>5
Y
输出t
1.4 算法的表示
例3 输入50名学生的学号和 成绩,并将50名学生中成绩 高于80分者的学号和成绩输 出。
(2) for(k=1;k<=n;k++) { x=x+y; y=x+y; s=x+y; } “k=1”执行1次;“k<=n”与“k++”各执行n次;3个赋值语 句,每个赋值语句各执行n次;共执行5n+1次. 时间复杂度
为O(n).
1.5 算法复杂度的分析
例1-3 试计算下面三个程序段的执行频数
(3) for(t=1,k=1;k<=n;k++) { t=t*2; for(j=1;j<=t;j++) s=s+j; }
23
1.4 算法的表示
用计算机语言表示算法
概念: 用计算机语言描述算法,就是用计算机语言编写程序。 计算机是无法识别流程图和伪代码的。只有用计算机语 言编写的程序才能被计算机执行。
特点:
设计算法的目的是为了实现算法。 用计算机语言表示算法,必须严格遵循所用的语言的语法 规则。
1.4 算法的表示
统栈空间等。
1.6 学好算法的秘诀
(1)学的要深入,基础要扎实 基础的作用不必多说,在大学课堂上曾经讲过了很多次,在此重点说明 “深入”。职场不是学校,企业要求你能高效的完成项目功能,但是现实中的 项目种类繁多,我们需要从根上掌握C语言算法技术的精髓。走马观花式的学 习已经被社会所淘汰,入门水平不会被开发公司所接受,他们需要的是高手。
传统流程图
N-S流程图
伪代码 计算机语言
1.4 算法的表示
传统流程图(流程图)
美国国家标准化协会ANSI(American National Standard Institute)规定了一些常用的流程图符号:
起止框
判断框
处理框
输入/输出框
注释框
流向线
连接点
1.4 算法的表示
开始 1t 2i t*it i+1i N i>5 Y 结束 图1 结束 图2 N i>5 Y 开始 1t 2i t*(2*i-1)t i+1i
举范围和判定条件;
(2)逐一枚举可能的解, 验证每个解是否是问题的 解。
2.1 经典算法——枚举法
2. 枚举的框架描述
n=0;
for(k=<区间下限>;k<=<区间上限>;k++) // 控制枚举范围 if(<约束条件>) // 根据约束条件实施筛选 // 输出解
{ printf(<满足要求的解>); n++; }
2.1 经典算法——枚举法
相关文档
最新文档