第一章 算法案例Word文档格式.docx
《第一章 算法案例Word文档格式.docx》由会员分享,可在线阅读,更多相关《第一章 算法案例Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
2+1813.
同理,2146与1813的最大公约数也是6105与2146的最大公约数.继续重复上述步骤:
2146=1813×
1+333,1813=333×
5+148,333=148×
2+37,148=37×
4.
最后的除数37是148和37的最大公约数,也就是8251与6105的最大公约数.
这就是辗转相除法.由除法的性质可以知道,对于任意两个正整数,上述除法步骤总可以在有限步之后完成,从而总可以用辗转相除法求出两个正整数的最大公约数.
算法分析:
从上面的例子可以看出,辗转相除法中包含重复操作的步骤,因此可以用循环结构来构造算法.
算法步骤如下:
第一步,给定两个正整数m,n.第二步,计算m除以n所得的余数为r.第三步,m=n,n=r.
第四步,若r=0,则m,n的最大公约数等于m;
否则,返回第二步.
程序框图如下图:
程序:
INPUTm,n
DO
r=mMODn
m=n
n=r
LOOPUNTILr=0
PRINTm
END
点评:
从教学实践看,有些学生不能理解算法中的转化过程,例如:
求8251与6105的最大公约数,为什么可以转化为求6105与2146的公约数.因为8251=6105×
1+2146,
可以化为8251-6105×
1=2164,所以公约数能够整除等式两边的数,即6105与2146的公约数也是8251与6105的公约数.
变式训练
你能用当型循环结构构造算法,求两个正整数的最大公约数吗?
试画出程序框图和程序.
当型循环结构的程序框图如下图:
INPUTm,n
r=1
WHILEr>0
WEND
例2.用更相减损术求98与63的最大公约数.
由于63不是偶数,把98和63以大数减小数,并辗转相减,如下图所示.
98-63=3563-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以,98和63的最大公约数等于7.
更相减损术与辗转相除法的比较:
尽管两种算法分别来源于东、西方古代数学名著,但是二者的算理却是相似的,有异曲同工之妙.主要区别在于辗转相除法进行的是除法运算,即辗转相除;
而更相减损术进行的是减法运算,即辗转相减,但是实质都是一个不断的递归过程.
例3.用辗转相除法或者更相减损术求三个数324,243,135的最大公约数.
解一:
324=243×
1+81,243=81×
3+0,则324与243的最大公约数为81.
又135=81×
1+54,81=54×
1+27,54=27×
2+0,则81与135的最大公约数为27.
所以,三个数324、243、135的最大公约数为27.
解二:
324-243=81,243-81=162,162-81=81,则324与243的最大公约数为81.
135-81=54,81-54=27,54-27=27,则81与135的最大公约数为27.
所以,三个数324、243.135的最大公约数为27.
例4.
(1)用辗转相除法求123和48的最大公约数.
(2)用更相减损术求80和36的最大公约数.
(1)辗转相除法求最大公约数的过程如下:
123=2×
48+27,48=1×
27+21,27=1×
21+6,21=3×
6+3,6=2×
3+0,
最后6能被3整除,得123和48的最大公约数为3.
(2)我们将80作为大数,36作为小数,因为80和36都是偶数,要除公因数2.
80÷
2=40,36÷
2=18.40和18都是偶数,要除公因数2.40÷
2=20,18÷
2=9.下面来求20与9的最大公约数,
20-9=11,11-9=2,9-2=7,7-2=5,5-2=3,3-2=1,2-1=1,可得80和36的最大公约数为22×
1=4.
对比两种方法控制好算法的结束,辗转相除法是到达余数为0,更相减损术是到达减数和差相等.
例5.分别用辗转相除法和更相减损术求1734,816的最大公约数.
一、辗转相除法:
1734=816×
2+102,816=102×
8(余0),∴1734与816的最大公约数是102.
二、更相减损术:
因为两数皆为偶数,首先除以2得到867,408,再求867与408的最大公约数.
867-408=459,459-408=51,408-51=357,357-51=306,306-51=255,255-51=204,204-51=153,
153-51=102,102-51=51.∴1734与816的最大公约数是51×
2=102.
更相减损术可另解:
1734-816=918,918-816=102,816-102=714,714-102=612,612-102=510,510-102=408,408-102=306,306-102=204,204-102=102.∴1734与816的最大公约数是102.
例6.求319,377,116的最大公约数.
377=319×
1+58,319=58×
5+29,58=29×
2.∴377与319的最大公约数为29,再求29与116的最大公约数.
116=29×
4.∴29与116的最大公约数为29.∴377,319,116的最大公约数为29.
拓展提升
试写出利用更相减损术求两个正整数的最大公约数的程序.
更相减损术程序:
INPUT“m,n=”;
m,n
WHILEm<
>
n
IFm>
nTHEN
m=m-n
ELSE
m=n-m
ENDIF
例7.分别用辗转相除法和更相减损术求261,319的最大公约数.
分析:
本题主要考查辗转相除法和更相减损术及其应用.使用辗转相除法可依据m=nq+r,反复执行,直到r=0为止;
用更相减损术就是根据m-n=r,反复执行,直到n=r为止.
辗转相除法:
319=261×
1+58,。
261=58×
4+29,58=29×
2.∴319与261的最大公约数是29.
更相减损术:
319-261=58,261-58=203,203-58=145,145-58=87,87-58=29,58-29=29,∴319与261的最大公约数是29.
第2课时案例2秦九韶算法
大家都喜欢吃苹果吧,我们吃苹果都是从外到里一口一口的吃,而虫子却是先钻到苹果里面从里到外一口一口的吃,由此看来处理同一个问题的方法多种多样.怎样求多项式f(x)=x5+x4+x3+x2+x+1当x=5时的值呢?
方法也是多种多样的,今天我们开始学习秦九韶算法.
前面我们学习了辗转相除法与更相减损术,今天我们开始学习秦九韶算法.
(1)求多项式f(x)=x5+x4+x3+x2+x+1当x=5时的值有哪些方法?
比较它们的特点.
(2)什么是秦九韶算法?
(3)怎样评价一个算法的好坏?
(1)怎样求多项式f(x)=x5+x4+x3+x2+x+1当x=5时的值呢?
一个自然的做法就是把5代入多项式f(x),计算各项的值,然后把它们加起来,这时,我们一共做了1+2+3+4=10次乘法运算,5次加法运算.
另一种做法是先计算x2的值,然后依次计算x2·
x,(x2·
x)·
x,((x2·
x的值,这样每次都可以利用上一次计算的结果,这时,我们一共做了4次乘法运算,5次加法运算.
第二种做法与第一种做法相比,乘法的运算次数减少了,因而能够提高运算效率,对于计算机来说,做一次乘法运算所用的时间比做一次加法运算要长得多,所以采用第二种做法,计算机能更快地得到结果.
(2)上面问题有没有更有效的算法呢?
我国南宋时期的数学家秦九韶(约1202~1261)在他的著作《数书九章》中提出了下面的算法:
把一个n次多项式f(x)=anxn+an-1xn-1+…+a1x+a0改写成如下形式:
f(x)=anxn+an-1xn-1+…+a1x+a0=(anxn-1+an-1xn-2+…+a1)x+a0=((anxn-2+an-1xn-3+…+a2)x+a1)x+a0
=…=(…((anx+an-1)x+an-2)x+…+a1)x+a0.
求多项式的值时,首先计算最内层括号内一次多项式的值,即v1=anx+an-1,
然后由内向外逐层计算一次多项式的值,即
v2=v1x+an-2,v3=v2x+an-3,…vn=vn-1x+a0,
这样,求n次多项式f(x)的值就转化为求n个一次多项式的值.
上述方法称为秦九韶算法.直到今天,这种算法仍是多项式求值比较先进的算法.
(3)计算机的一个很重要的特点就是运算速度快,但即便如此,算法好坏的一个重要标志仍然是运算的次数.如果一个算法从理论上需要超出计算机允许范围内的运算次数,那么这样的算法就只能是一个理论的算法.
应用示例
例7.已知一个5次多项式为f(x)=5x5+2x4+3.5x3-2.6x2+1.7x-0.8,用秦九韶算法求这个多项式当x=5时的值.
根据秦九韶算法,把多项式改写成如下形式:
f(x)=((((5x+2)x+3.5)x-2.6)x+1.7)x-0.8,按照从内到外的顺序,依次计算一次多项式当x=5时的值:
v0=5;
v1=5×
5+2=27;
v2=27×
5+3.5=138.5;
v3=138.5×
5-2.6=689.9;
v4=689.9×
5+1.7=3451.2;
v5=3415.2×
5-0.8=17255.2;
所以,当x=5时,多项式的值等于17255.2.
观察上述秦九韶算法中的n个一次式,可见vk的计算要用到vk-1的值,若令v0=an,我们可以得到下面的公式:
这是一个在秦九韶算法中反复执行的步骤,因此可用循环结构来实现.
第一步,输入多项式次数n、最高次的系数an和x的值.
第二步,将v的值初始化为an,将i的值初始化为n-1.
第三步,输入i次项的系数ai.
第四步,v=vx+ai,i=i-1.
第五步,判断i是否大于或等于0.若是,则返回第三步;
否则,输出多项式的值v.
INPUT“n=”;
INPUT“an=”;
a
INPUT“x=”;
x
v=a
i=n-1
WHILEi>=0
PRINT“i=”;
i
INPUT“ai=”;
v=v*x+a
i=i-1
PRINTv
例请以5次多项式函数为例说明秦九韶算法,并画出程序框图.
设f(x)=a5x5+a4x4+a3x3+a2x2+a1x+a0
首先,让我们以5次多项式一步步地进行改写:
f(x)=(a5x4+a4x3+a3x2+a2x+a1)x+a0=((a5x3+a4x2+a3x+a2)x+a1)x+a0=(((a5x2+a4x+a3)x+a2)x+a1)x+a0
=((((a5x+a4)x+a3)x+a2)x+a1)x+a0.上面的分层计算,只用了小括号,计算时,首先计算最内层的括号,然后由里向外逐层计算,直到最外层的括号,然后加上常数项即可.
例2已知n次多项式Pn(x)=a0xn+a1xn-1+…+an-1x+an,如果在一种算法中,计算
(k=2,3,4,…,n)的值需要k-1次乘法,计算P3(x0)的值共需要9次运算(6次乘法,3次加法),那么计算P10(x0)的值共需要__________次运算.下面给出一种减少运算次数的算法:
P0(x)=a0,Pk+1(x)=xPk(x)+ak+1(k=0,1,2,…,n-1).利用该算法,计算P3(x0)的值共需要6次运算,计算P10(x0)的值共需要___________次运算.
答案:
6520
秦九韶算法适用一般的多项式f(x)=anxn+an-1xn-1+…+a1x+a0的求值问题.直接法乘法运算的次数最多可到达
,加法最多n次.秦九韶算法通过转化把乘法运算的次数减少到最多n次,加法最多n次.
例8.已知多项式函数f(x)=2x5-5x4-4x3+3x2-6x+7,求当x=5时的函数的值.
解析:
把多项式变形为:
f(x)=2x5-5x4-4x3+3x2-6x+7=((((2x-5)x-4)x+3)x-6)x+7.
计算的过程可以列表表示为:
最后的系数2677即为所求的值.
算法过程:
v0=2;
v1=2×
5-5=5;
v2=5×
5-4=21;
v3=21×
5+3=108;
v4=108×
5-6=534;
v5=534×
5+7=2677.
如果多项式函数中有缺项的话,要以系数为0的项补齐后再计算.
例9.当x=2时,用秦九韶算法求多项式f(x)=3x5+8x4-3x3+5x2+12x-6的值.
解法一:
f(x)=((((3x+8)x-3)x+5)x+12)x-6.
按照从内到外的顺序,依次计算一次多项式当x=2时的值.
v0=3;
v1=v0×
2+8=3×
2+8=14;
v2=v1×
2-3=14×
2-3=25;
v3=v2×
2+5=25×
2+5=55;
v4=v3×
2+12=55×
2+12=122;
v5=v4×
2-6=122×
2-6=238.∴当x=2时,多项式的值为238.
解法二:
f(x)=((((3x+8)x-3)x+5)x+12)x-6,则f
(2)=((((3×
2+8)×
2-3)×
2+5)×
2+12)×
2-6=238.
例10.用秦九韶算法求多项式f(x)=7x7+6x6+5x5+4x4+3x3+2x2+x当x=3时的值.
f(x)=((((((7x+6)+5)x+4)x+3)x+2)x+1)x
v0=7;
v1=7×
3+6=27;
3+5=86;
v3=86×
3+4=262;
v4=262×
3+3=789;
v5=789×
3+2=2369;
v6=2369×
3+1=7108;
v7=7108×
3+0=21324.∴f(3)=21324.
第3课时案例3排序
直接插入排序(straightinsertionsort)的作法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中;
第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;
依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
冒泡排序(BubbleSort)的基本概念是:
依次比较相邻的两个数,将小数放在前面,大数放在后面。
即在第一趟:
首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
至此第一趟结束,将最大的数放到了最后。
在第二趟:
仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
如此下去,重复以上过程,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
例11.采用直接插入法和冒泡法将下列数:
8,3,2,5,9,6从小到大进行排列。
例12.用冒泡法对数据7,5,3,4,1从小到大进行排序
第4课时案例4进位制
情境导入
在日常生活中,我们最熟悉、最常用的是十进制,据说这与古人曾以手指计数有关,爱好天文学的古人也曾经采用七进制、十二进制、六十进制,至今我们仍然使用一周七天、一年十二个月、一小时六十分的历法.今天我们来学习一下进位制.
(1)你都了解哪些进位制?
(2)举出常见的进位制.(3)思考非十进制数转换为十进制数的转化方法.
(4)思考十进制数转换成非十进制数及非十进制之间的转换方法.
(1)进位制是人们为了计数和运算方便而约定的计数系统,约定满二进一,就是二进制;
满十进一,就是十进制;
满十二进一,就是十二进制;
满六十进一,就是六十进制等等.也就是说:
“满几进一”就是几进制,几进制的基数(都是大于1的整数)就是几.
(2)在日常生活中,我们最熟悉、最常用的是十进制,据说这与古人曾以手指计数有关,爱好天文学的古人也曾经采用七进制、十二进制、六十进制,至今我们仍然使用一周七天、一年十二个月、一小时六十分的历法.
(3)十进制使用0~9十个数字.计数时,几个数字排成一行,从右起,第一位是个位,个位上的数字是几,就表示几个一;
第二位是十位,十位上的数字是几,就表示几个十;
接着依次是百位、千位、万位……
例如:
十进制数3721中的3表示3个千,7表示7个百,2表示2个十,1表示1个一.于是,我们得到下面的式子:
3721=3×
103+7×
102+2×
101+1×
100.与十进制类似,其他的进位制也可以按照位置原则计数.由于每一种进位制的基数不同,所用的数字个数也不同.如二进制用0和1两个数字,七进制用0~6七个数字.
一般地,若k是一个大于1的整数,那么以k为基数的k进制数可以表示为一串数字连写在一起的形式
anan-1…a1a0(k)(0<an<k,0≤an-1,…,a1,a0<k).
其他进位制的数也可以表示成不同位上数字与基数的幂的乘积之和的形式,如
110011
(2)=1×
25+1×
24+0×
23+0×
22+1×
21+1×
20,7342(8)=7×
83+3×
82+4×
81+2×
80.
非十进制数转换为十进制数比较简单,只要计算下面的式子值即可:
anan-1…a1a0(k)=an×
kn+an-1×
kn-1+…+a1×
k+a0.
第一步:
从左到右依次取出k进制数anan-1…a1a0(k)各位上的数字,乘以相应的k的幂,k的幂从n开始取值,每次递减1,递减到0,即an×
kn,an-1×
kn-1,…,a1×
k,a0×
k0;
第二步:
把所得到的乘积加起来,所得的结果就是相应的十进制数.
(4)关于进位制的转换,教科书上以十进制和二进制之间的转换为例讲解,并推广到十进制和其他进制之间的转换.这样做的原因是,计算机是以二进制的形式进行存储和计算数据的,而一般我们传输给计算机的数据是十进制数据,因此计算机必须先将十进制数转换为二进制数,再处理,显然运算后首次得到的结果为二进制数,同时计算机又把运算结果由二进制数转换成十进制数输出.
1°
十进制数转换成非十进制数
把十进制数转换为二进制数,教科书上提供了“除2取余法”,我们可以类比得到十进制数转换成k进制数的算法“除k取余法”.
2°
非十进制之间的转换
一个自然的想法是利用十进制作为桥梁.教科书上提供了一个二进制数据与16进制数据之间的互化的方法,也就是先由二进制数转化为十进制数,再由十进制数转化成为16进制数.
例13.把二进制数110011
(2)化为十进制数.
20=1×
32+1×
16+1×
2+1=51.
先把二进制数写成不同位上数字与2的幂的乘积之和的形式,再按照十进制的运算规则计算出结果.
设计一个算法,把k进制数a(共有n位)化为十进制数b.
从例1的计算过程可以看出,计算k进制数a的右数第i位数字ai与ki-1的乘积ai·
ki-1,再将其累加,这是一个重复操作的步骤.所以,可以用循环结构来构造算法.算法步骤如下:
第一步,输入a,k和n的值.
第二步,将b的值初始化为0,i的值初始化为1.
第三步,b=b+ai·
ki-1,i=i+1.
第四步,判断i>n是否成立.若是,则执行第五步;
否则,返回第三步.
第五步,输出b的值.
INPUT“a,k,n=”;
a,k,n
b=0
i=1
t=aMOD10
b=b+t*k^(i-1)
a=a\\10
t=aMOD10
i=i+1
LOOPUNTILi>n
PRINTb
例14.把89化为二进制数.
根据二进制数“满二进一”的原则,可以用2连续去除89或所得商,然后取余数.具体计算方法如下:
因为89=2×
44+1,44=2×
22+0,
22=2×
11+0,11=2×
5+1,5=2×
2+1,