没有合适的资源?快使用搜索试试~ 我知道了~
c语言基础算法教案.doc 详细的算法讲解 适合入门学习者
资源详情
资源评论
资源推荐
基础算法教案 目录
第一课 算法简介...........................................................................................................................................................1
第二课 多精度数值处理...............................................................................................................................................1
第三课 排列与组合.......................................................................................................................................................6
第四课 枚举法...............................................................................................................................................................9
第五课 递归与回溯法.................................................................................................................................................26
第六课 递推法.............................................................................................................................................................43
第七课 贪心法.............................................................................................................................................................51
第八课 分治法.............................................................................................................................................................66
第九课 模拟法.............................................................................................................................................................72
习 题.............................................................................................................................................................................81
基础算法教案 第 0 页 共 84 页
第一课 算法简介
算法是一组(有限个)规则,它为某个特定问题提供了解决问题的运算序列。在信息学竞赛中,就是
计算机解题的过程。在这个过程中,无论是形成解题思路还是编写算法,都是在实施某种算法。前者
是推理实现的算法,后者是操作实现的算法。
计算机解题的核心是算法设计。一个算法应该具有以下五个重要特征:
1 有穷性:一个算法必须能在执行有限步之后结束;
2 确切性:算法的每一步骤必须确切定义;
3 输入:一个算法有零个或多个输入,以描述运算对象的初始情况。所谓 0 个输入是指算法本
身给出了初始条件;
4 输出:一个算法有一个或多个输出,以反映对输入数据处理后的结果。没有输出的算法是毫
无意义的;
5 可行性:算法原则上能够精确的运行,而且其运算规模是可以承受的。
为了获得一个既有效又优美的算法,必须首先了解一些基本的常用算法设计思路。下面,我们就对构
成算法所依据的一些基本方法展开讨论,如递推法,递归法,枚举法,分治法,模拟法,贪心法等。
第二课 多精度数值处理
课题:多精度数值的处理
目标:
知识目标:多精度值的加、减、乘、除
能力目标:多精度值的处理,优化!
重点:多精度的加、减、乘
难点:进位与借位处理
板书示意:
1)输入两个正整数,求它们的和
2)输入两个正整数,求它们的差
3)输入两个正整数,求它们的积
4)输入两个正整数,求它们的商
授课过程:
所谓多精度值处理,就是在对给定的数据范围,用语言本身提供的数据类型无法直接进行处理(主要
指加减乘除运算),而需要采用特殊的处理办法进行。看看下面的例子。
例 1 从键盘读入两个正整数,求它们的和。
分析:从键盘读入两个数到两个变量中,然后用赋值语句求它们的和,输出。但是,我们知道,在
pascal 语言中任何数据类型都有一定的表示范围。而当两个被加数据大时,上述算法显然不能求出精
确解,因此我们需要寻求另外一种方法。在读小学时,我们做加法都采用竖式方法,如图 1。
基础算法教案 第 1 页 共 84 页
这样,我们方便写出两个整数相加的算法。
如果我们用数组 A、B 分别存储加数和被加数,用数组 C 存储结果。则上例有
A[1]=6, A[2]=5, A[3]=8, B[1]=5,B[2]=5, B[3]=2, C[4]=1,C[3]=1, C[2]=1,C[1]=1,两数相
加如图 2 所示。由上图可以看出:
C[i]:= A[i]+B[i];
if C[i]>10 then begin C[i]:= C[i] mod 10; C[i+1]:= C[i+1]+1 end;
因此,算法描述如下:
procedure add(a,b;var c);
{ a,b,c 都为数组,a 存储被加数,b 存储加数,c 存储结果 }
var i,x:integer;
begin
i:=1
while (i<=a 数组长度>0) or(i<=b 数组的长度) do begin
x := a[i] + b[i] + x div 10; {第 i 位相加并加上次的进位}
c[i] := x mod 10; {存储第 i 位的值}
i := i + 1 {位置指针变量}
end
end;
通常,读入的两个整数用可用字符串来存储,程序设计如下:
program exam1;
const
max=200;
var
a,b,c:array[1..max] of 0..9;
n:string;
lena,lenb,lenc,i,x:integer;
begin
write('Input augend:'); readln(n);
lena:=length(n); {加数放入 a 数组}
for i:=1 to lena do a[lena-i+1]:=ord(n[i])-ord('0');
write('Input addend:'); readln(n);
lenb:=length(n); {被加数放入 b 数组}
for i:=1 to lenb do b[lenb-i+1]:=ord(n[i])-ord('0');
基础算法教案 第 2 页 共 84 页
8 5 6
+ 2 5 5
1 1 1 1
图 1
A
3
A
2
A
1
+ B
3
B
2
B
1
C
4
C
3
C
2
C
1
图 2
i:=1;
while (i<=lena) or(i<=lenb) do begin
x := a[i] + b[i] + x div 10; {两数相加,然后加前次进位}
c[i] := x mod 10; {保存第 i 位的值}
i := i + 1
end;
if x>=10 then {处理最高进位}
begin lenc:=i;c[i]:=1 end
else lenc:=i-1;
for i:=lenc downto 1 do write(c[i]); {输出结果}
writeln
end.
例 2 高精度减法。
从键盘读入两个正整数,求它们的差。
分析:类似加法,可以用竖式求减法。在做减法运算时,需要注意的是:被减数必须比减数大,
同时需要处理借位。
因此,可以写出如下关系式
if a[i]<b[i] then begin a[i+1]:=a[i+1]-1;a[i]:=a[i]+10 end
c[i]:=a[i]-b[i]
类似,高精度减法的参考程序:
program exam2;
const
max=200;
var
a,b,c:array[1..max] of 0..9;
n,n1,n2:string;
lena,lenb,lenc,i,x:integer;
begin
write('Input minuend:'); readln(n1);
write('Input subtrahend:'); readln(n2);
{处理被减数和减数}
if (length(n1)<length(n2)) or (length(n1)=length(n2)) and (n1<n2) then
begin
n:=n1;n1:=n2;n2:=n;
write('-') {n1<n2,结果为负数}
end;
lena:=length(n1); lenb:=length(n2);
for i:=1 to lena do a[lena-i+1]:=ord(n1[i])-ord('0');
基础算法教案 第 3 页 共 84 页
for i:=1 to lenb do b[lenb-i+1]:=ord(n2[i])-ord('0');
i:=1;
while (i<=lena) or(i<=lenb) do begin
x := a[i] - b[i] + 10 + x; {不考虑大小问题,先往高位借 10}
c[i] := x mod 10 ; {保存第 i 位的值}
x := x div 10 - 1; {将高位借掉的 1 减去}
i := i + 1
end;
lenc:=i;
while (c[lenc]=0) and (lenc>1) do dec(lenc); {最高位的 0 不输出}
for i:=lenc downto 1 do write(c[i]);
writeln
end.
例 3 高精度乘法。
从键盘读入两个正整数,求它们的积。
分析:类似加法,可以用竖式求乘法。在做乘法运算时,同样也有进位,同时对每一位进乘法运
算时,必须进行错位相加,如图 3, 图 4。
分析 C 数组下标的变化规律,可以写出如下关系式
C
i
= C
’
i
+C
”
i
+…
由此可见,C
i
跟 A[i]*B[j]乘积有关,跟上次的进位有关,还跟原 C
i
的值有关,分析下标规律,有
x:= A[i]*B[j]+ x DIV 10+ C[i+j-1];
C[i+j-1] := x mod 10;
类似,高精度乘法的参考程序:
program exam3;
const
max=200;
var
a,b,c:array[1..max] of 0..9;
n1,n2:string;
基础算法教案 第 4 页 共 84 页
8 5 6
× 2 5
4 2 8 0
1 7 1 2
2 1 4 0 0
图 3
A
3
A
2
A
1
× B
3
B
2
B
1
C
’
4
C
’
3
C
’
2
C
’
1
C
”
5
C
”
4
C
”
3
C
”
2
C
6
C
5
C
4
C
3
C
2
C
1
图 4
剩余63页未读,继续阅读
编程小白鼠
- 粉丝: 1
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0