1、第八课时 算法案例教学目标:本节通过算法案例的学习,进一步理解算法的含义,掌握算法设计的常用方法.教学重点:如何在伪代码中运用条件语句.教学难点:如何在伪代码中运用条件语句.教学过程:.课题导入1.中国古代数学中算法的内容是非常丰富的,比如,中国古代数学著作九章算术中介绍了下述“约分术”:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也.以等数约之.”给出了求任意两个数的最大公约数的一种算法,被后人称为“更相减损术”.这种方法与欧氏的辗转相除法异曲同工,本质上是相同的.2.中国是研究不定方程最早的国家,公元初的五家共井问题就是一个不定方程组问题,公元 5 世纪的张丘建算经
2、中的百鸡问题标志着中国对不定方程理论有了系统研究.秦九韶的大衍求一术将不定方程与同余理论联系起来.研究不定方程要解决三个问题:判断何时有解;有解时决定解的个数;求出所有的解.二分法是用计算机求解多项式方程的一种常用方法.基本思想是:如果取a,b的中点 x0=(a+b) /2;若 f(x0)=0,则 x0 就是方程的根,若 f(a)f(x0)0,则解在(x 0,b)上,以x0 代替 a,否则解在(a,x 0)之间,以 x0 代替 b,重复上述步骤,直到 |a b|b) ,求它们的最大公约数.解析:求两个正整数 a、b(ab)的最大公约数,可以归结为求一数列:a,b,r 1,r 2,r n 1,r
3、 n,r n+1,0此数列的首项与第二项是 a 和 b,从第三项开始的各项,分别是前两项相除所得的余数,如果余数为 0,它的前项 rn+1 即是 a 和 b 的最大公约数,这种方法叫做欧几里得辗转相除法,其算法如下:S1 输入 a,b(a b) ;S2 求 a/b 的余数 r;S3 如果 r0 ,则将 ba,rb,再次求 a/b 的余数 r,转至 S2;S4 输出最大公约数 b.伪代码如下:10 Read a,b20 rmod(a,b)30 If r=0 then Goto 8040 Else50 ab60 br70 Goto 2080 Print b流程图如下: 输 入 ,abr abmod
4、(,)r=0a bb r输 出 bYN点评:算法的多样性:对于同一个问题,可以有不同的算法.例如求 1+2+3+100 的和,可以采用如下方法:先求 1+2,再加 3,再加 4,一直加到 100,最后得到结果 5050.也可以采用这样的方法:1+2+3+100=(1+100)+(2+99)+(3+98)+ +(50+51)=50101=5050.显然,对于算法来说,后一种方法更简便,而循环累加更适用于计算机解题.因此,为了有效地进行解题,不仅要保证算法正确,还要选择好的算法,即方法简单、运算步骤少,能迅速得出正确结果的算法.例 5:求 1734,816,1343 的最大公约数.分析:三个数的最
5、大公约数分别是每个数的约数,因此也是任意两个数的最大公约数的约数,也就是说三个数的最大公约数是其中任意两个数的最大公约数与第三个数的最大公约数.解:用“辗转相除法”.先求 1734 和 816 的最大公约数,1734=8162+102;816=1028;所以 1734 与 816 的最大公约数为 102.再求 102 与 1343 的最大公约数,1343=10213+17;102=176.所以 1343 与 102 的最大公约数为 17,即 1734,816,1343 的最大公约数为 17.例 6:猴子吃桃问题:有一堆桃子不知数目,猴子第一天吃掉一半,觉得不过瘾,又多吃了一只,第二天照此办法,
6、吃掉剩下桃子的一半另加一个,天天如此,到第十天早上,猴子发现只剩一只桃子了,问这堆桃子原来有多少个?解析:此题粗看起来有些无从着手的感觉,那么怎样开始呢?假设第一天开始时有 a1只桃子,第二天有 a2 只第 9 天有 a9 只,第 10 天有 a10 只.在 a1,a 2,a 10 中,只有a10=1 是知道的,现要求 a1,而我们可以看出 a1,a 2,a 10 之间存在一个简单的关系:a9=2(a 10+1) ,a8=2(a 9+1) ,a1=2(a 2+1).也就是:a i=2(a i+1+1) i =9,8,7,6,1.这就是此题的数学模型.再考察上面从 a9,a 8 直至 a1 的计
7、算过程,这其实是一个递推过程,这种递推的方法在计算机解题中经常用到.另一方面,这九步运算从形式上完全一样,不同的只是 ai 的下标而已.由此,我们引入循环的处理方法,并统一用 a0 表示前一天的桃子数,a 1 表示后一天的桃子数,将算法改写如下:S1 a 11;第 10 天的桃子数,a 1 的初值S2 i9;计数器初值为 9S3 a 02(a 1+1) ;计算当天的桃子数S4 a 1a 0;将当天的桃子数作为下一次计算的初值S5 ii 1;S6 若 i1,转 S3;S7 输出 a0 的值;伪代码如下:10 a 1120 i930 a 02(a 1+1)40 a 1a 0.50 ii 160 I
8、f i1 then Goto 3070 Else80 Print a0流程图如下:i 9i i-1i 1输 出 aNYa 11a a 2 ( +1)10aa 1 00点评:这是一个从具体到抽象的过程,具体方法:(1)弄清如果由人来做,应该采取哪些步骤;(2)对这些步骤进行归纳整理,抽象出数学模型;(3)对其中的重复步骤,通过使用相同变量等方式求得形式的统一,然后简练地用循环解决.课堂练习课本 P30 1,2.课时小结算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.1.本节通过对解决具体问题过程与步骤的分析(如求两个数的最大公约数) ,体会算法的思想,进
9、一步了解算法的含义.2.本节通过阅读中国古代数学中的算法案例,如约分术,体会中国古代数学对世界数学发展的贡献.通过学生自己的亲身实践,亲自去解决几个算法设计的问题,才能体会到算法的基本思想.数学的其他内容与算法密切相关,如函数、数列等.我们在学习这些内容时要和算法联系起来.课后作业课本 P31 1,3.变式练习1.数 4557、1953、5115 的最大公约数是( )A.31 B.93 C.217 D.651答案:B2.下面的伪代码的算法目的是( )10 Read x,y20 mx30 ny40 If m/n=int(m/n) then Goto 9050 cm int(m/n)n60 mn7
10、0 nc80 Goto 4090 a(xy)/n100 Print aA.求 x,y 的最小公倍数B.求 x, y 的最大公约数C.求 x 被 y 整除的商D.求 y 除以 x 的余数答案:B3.下面的伪代码的算法目的是 .Read X,YIf XY thenPrint XElsePrint YEnd if答案:输出 x,y 两个值中较大的一个值4.下面的伪代码的算法目的是 .Read a,b,c,If ab thentaabbtElse if ac thentaacctElse if bc thentbbccbEnd ifPrint a, b,c答案:输入三个数,要求由小到大的顺序输出5.流
11、程图填空:输入 x 的值,通过函数 y= 求出 y 的值. 其算法流程图如下:,10 32, x 开 始输 入 xx 1YYN N输 出 y 输 出 y 输 出 yy x2-1结 束 y y答案:x 1x 0,则 ax 0;否则 bx 0;S3 若|a b|c,计算终止,x 0 就是方程的根,否则转 S1.写出用区间二分法求方程 2x3 4x2+3x 6=0 在区间( 10,10)之间的一个近似解(误差不超过 0.001)的一个算法.答案:解:伪代码:10 Read a,b ,c20 x 0(a+b)/230 f(a)2a 3 4a2+3a 640 f(x 0)2 x3 4x2+3x 650
12、If f(x 0)=0 then Goto 12060 If f(a)f(x 0)0 then70 bx 080 Else90 ax 0100 End if110 If |a b|c then Goto 20120 Print x0流程图:输 入 ,abc输 出 xN NNYYYfafx()( ) 00fx( )=000b x0a x00fa aaa() 2 -4 +3-623fx xxx() 2 -4 +3-623x (+)/2ab0abc- 11.求三个数 390,455,546 的最大公约数.答案:13.12.迭代法是用于求方程或方程组近似根的一种常用的算法设计方法.设方程为 f(x)=
13、0,用某种数学方法导出等价的形式 x=g(x),然后按以下步骤执行:(1)选一个方程的近似根,赋给变量 x0;(2)将 x0 的值保存于变量 x1,然后计算 g(x1),并将结果存于变量 x0;(3)当 x0 与 x1 的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算.若方程有根,则按上述方法求得的 x0 就认为是方程的根.试用迭代法求某个数的平方根,用流程图和伪代码表示问题的算法.已知求平方根的迭代公式为 x1= (x 0+ ).2a答 案 : 解 : 设 平 方 根 的 解 为 x, 可 假 定 一 个 初 值 x0=a/2( 估 计 值 ) , 根 据 迭 代 公 式 得 到 一
14、个 新 的 值 x1, 这 个 新 值 比 初 值 x0 更 接 近 要 求 的 值 x; 再 以 新 值 作 为 初 值 , 即 x1 x0, 重 新 按原 来 的 方 法 求 x1, 重 复 这 一 过 程 直 到 |x1 x0| ( 某 一 给 定 的 精 度 ) .此 时 可 将 x0 作 为 问 题 的解 .伪代码:Read x0,Repeatx1(x 0+a/x0)/2r|x 1 x0|x0x 1Until rPrint x 0流程图:r e NY输 出 x0输 入 ,xe0x x0 1x xax ( +/ )/2001r x x-0113.写出计算 1+2!+3!+20!的算法的
15、伪代码和流程图.答案:解析:这是一个循环结构,可以用循环语句实现.伪代码和流程图如下:T1S0For n from 1 to 20TTnSS+TEnd forPrint S T 1S 0n 1T TnS ST+n=20输 出 SY Nn n+114.未知数的个数多于方程个数的方程(组)叫做不定方程.最早提出不定方程的是我国的九章算术.实际生活中有很多不定方程的例子,例如“百鸡问题”:公元五世纪末,我国古代数学家张丘建在算经中提出了“百鸡问题”:“鸡母一,值钱三;鸡翁一,值钱二;鸡雏二,值钱一.百钱买百鸡,问鸡翁、母、雏各几何?”算法设计:(1)设母鸡、公鸡、小鸡数分别为 I、J、K,则应满足如
16、下条件:I+J+K=100;3 I+2J+1/2K=100.(2)先分析一下三个变量的可能值.I 的最小值可能为零,若全部钱用来买母鸡,最多只能买 33 只,故 I 的值为 033 中的整数.J 的最小值为零,最大值为 50.K 的最小值为零,最大值为 100.(3)对 I、J、K 三个未知数来说,I 取值范围最少.为提高程序的效率,先考虑对 I 的值进行一一列举.(4)在固定一个 I 的值的前提下,再对 J 值进行一一列举 .(5)对于每个 I,J,怎样去寻找满足百钱买百鸡条件的 K.由于 I,J 值已设定,便可由下式得到:K=100 I J.(6)这时的 I,J,K 是一组可能解,它只满足“百鸡”条件,还未满足“百钱”条件.是否真实解,还要看它们是否满足 3I+2J+1/2K=100,满足即为所求解 .根据上述算法思想,画出流程图并用伪代码表示.答案:解:这是一个循环结构的嵌套,可以用循环语句实现.伪代码:For I from 0 to 32For J from 0 to 49K100 I JIf 3I+2J+0.5K=100 thenPrint I,J,KEnd forEnd for流程图: 开 始I 0J 0K IJ 10-3+2+0.5=10I J K输 出 、 、I JKJJ +1J 50I I +1I 3结 束NNNNYYY