1.3算法案例辗转相除法与更相减损术秦九韶算法进位制辗转相除法与更相减损术1、求两个正整数的最大公约数(1)求25和35的最大公约数(2)求225和135的最大公约数2、求8251和6105的最大公约数25(1)55357所以,25和35的最大公约数为5所以,225和135的最大公约数为5×3×3=45课前复习225(2)545135273159知识回顾:先用两个数公有的质因数连续去除,一直除到所得的商是互质数为止,然后把所有的除数连乘起来335辗转相除法(欧几里得算法)观察用辗转相除法求8251和6105的最大公约数的过程第一步用两数中较大的数除以较小的数,求得商和余数8251=6105×1+2146结论:8251和6105的公约数就是6105和2146的公约数,求8251和6105的最大公约数,只要求出6105和2146的公约数就可以了。第二步对6105和2146重复第一步的做法6105=2146×2+1813同理6105和2146的最大公约数也是2146和1813的最大公约数。完整的过程8251=6105×1+21466105=2146×2+18132146=1813×1+3331813=333×5+148333=148×2+37148=37×4+0例用辗转相除法求225和135的最大公约数225=135×1+90135=90×1+4590=45×2显然37是148和37的最大公约数,也就是8251和6105的最大公约数显然45是90和45的最大公约数,也就是225和135的最大公约数思考1:从上面的两个例子可以看出计算的规律是什么?S1:用大数除以小数S2:除数变成被除数,余数变成除数S3:重复S1,直到余数为0•第一步,给定两个正数m、n•第二步,计算m除以n所得到余数r•第三步,m=n;n=r•第四步,若r=0,则m、n的最大公约数等于m;否则返回第二步辗转相除法求最大公约数算法:辗转相除法是一个反复执行直到余数等于0停止的步骤,这实际上是一个循环结构。否开始输入两个正数m,nmn?r=mMODnr=0?输出m结束m=xm=nn=r否是是INPUTm,nIFmnTHENx=nn=mm=xENDIFr=mMODnDOr=0m=nn=rr=mMODnLOOPUNTILPRINTmENDx=nn=mP45练习1更相减损术算理:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也,以等数约之。第一步:任意给定两个正整数;判断他们是否都是偶数。若是,则用2约简;若不是,则执行第二步。第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止,则这个等数或这个等数与约简的数的乘积就是所求的最大公约数。例1、用更相减损术求98与63的最大公约数.解:由于63不是偶数,把98和63以大数减小数,并辗转相减,即:98-63=35;63-35=28;35-28=7;28-7=21;21-7=14;14-7=7.所以,98与63的最大公约数是7。二者算理相似,有异曲同工之妙1、都是求最大公约数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显。2、从结果体现形式来看,辗转相除法体现结果是以相除余数为0则得到,而更相减损术则以减数与差相等而得到(差为0)辗转相除法与更相减损术的区别P45练习1秦九韶算法[问题1]设计求多项式f(x)=2x5-5x4-4x3+3x2-6x+7当x=5时的值的算法,并写出程序.x=5f=2*x^5-5*x^4-4*x^3+3*x^2-6*x+7PRINTfEND程序点评:上述算法一共做了15次乘法运算,5次加法运算.优点是简单,易懂;缺点是不通用,不能解决任意多项多求值问题,而且计算效率不高.这析计算上述多项式的值,一共需要4次乘法运算,5次加法运算.[问题2]有没有更高效的算法?分析:计算x的幂时,可以利用前面的计算结果,以减少计算量,即先计算x2,然后依次计算222,(),(())xxxxxxxxx的值.第二种做法与第一种做法相比,乘法的运算次数减少了,因而能提高运算效率.而且对于计算机来说,做一次乘法所需的运算时间比做一次加法要长得多,因此第二种做法能更快地得到结果.[问题3]能否探索更好的算法,来解决任意多项式的求值问题?f(x)=2x5-5x4-4x3+3x2-6x+7=(2x4-5x3-4x2+3x-6)x+7=((2x3-5x2-4x+3)x-6)x+7=(((2x2-5x-4)x+3)x-6)x+7=((((2x-5)x-4)x+3)x-6)x+7v0=2v1=v0x-5=2×5-5=5v2=v1x-4=5×5-4=21v3=v2x+3=21×5+3=108v4=v3x-6=108×5-6=534v5=v4x+7=534×5+7=2677这种求多项式值的方法就叫秦九韶算法.f(x)=anxn+an-1xn-1+an-2xn-2+……+a1x+a0.我们可以改写成如下形式:求多项式的值时,首先计算最内层括号内一次多项式的值,即v1=anx+an-1,然后由内向外逐层计算一次多项式的值,即一般地,对于一个n次多项式v2=v1x+an-2,v3=v2x+an-3,……,vn=vn-1x+a0.这样,求n次多项式f(x)的值就转化为求n个一次多项式的值.这种算法称为秦九韶算法.f(x)=(…(anx+an-1)x+an-2)x+…+a1)x+a0.秦九韶算法点评:秦九韶算法是求一元多项式的值的一种方法.它的特点是:把求一个n次多项式的值转化为求n个一次多项式的值,通过这种转化,把运算的次数由至多n(n+1)/2次乘法运算和n次加法运算,减少为n次乘法运算和n次加法运算,大大提高了运算效率.v1=anx+an-1,v2=v1x+an-2,v3=v2x+an-3,……,vn=vn-1x+a0.观察上述秦九韶算法中的n个一次式,可见vk的计算要用到vk-1的值.若令v0=an,得v0=an,vK=vK-1x+an-k(k=1,2,……,n)这是一个在秦九韶算法中反复执行的步骤,因此可用循环结构来实现.[问题]画出程序框图,表示用秦九韶算法求5次多项式f(x)=a5x5+a4x4+a3x3+a2x2+a1x+a0当x=x0(x0是任意实数)时的值的过程,然后写出程序.算法步骤如下:第一步,输入多项式次数n、最高次项的系数an和x的值.第二步,将v的值初始化为an,将i的值初始化为n-1.第三步,输入i次项的系数ai.第四步,v=vx+ai,i=i-1.第五步,判断i是否大于或等于0,若是,则返回第三步;否则,输出多项式的值v.否程序框图开始输入n,an,x的值i≥0?i=n-1v=anv=vx+aii=i-1输出v结束是INPUT“n=”;nINPUT“an=”;aINPUT“x=”;xv=ai=n-1WHILEi=0PRINT“i=”;IINPUT“ai=”;av=v*x+ai=i-1WENDPRINTvEND输入aiP45练习2