算法案例.doc.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法案例.doc

更相减损术与辗转相除法对比研究 课题:人教B版必修三第一章《算法》中的算法案例一节中,有关于对求两个数最大公约数的两种不同的算法—更相减损术 (一)更相减损术与辗转相除法概述 《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。” 翻译成现代语言如下: 第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。 第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止,则这个等数就是所求的最大公约数。 其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法 例 用更相减损术求98与63的最大公约数 解:由于63不是偶数,把98和63以大数减小数,并展转相减 98-63=35 63-35=28 35-28=7 28-7=14 14-7=7所以,98和63的最大公约数等于7。“辗转相除法”又叫做“欧几里得算法”,是公元前300年左右的希腊数学家欧几里得在他的著作《几何原本》提出的。利用这个方法,可以较快地求出两个自然数的最大公数,(greatest common divisor,简写为gcd;或highest common factor,简写为hcf)例如8和12的最大公因数是4,记作gcd(8,12)=4。辗转相除法用来计算两个数的最大公因数其理论如下:如果q和r是m除以n的商及余数,即 m=nq+r,则 gcd(m,n)=gcd(n,r)。 证明:设a=gcd(m,n),b=gcd(n,r) a=gcd(m,n)m能被a整除,并且n也能被a整除,得:qn也能被a整除 得:m-qn也能被a整除而m-qn=r,即r也能被a整除,所以a=b b=gcd(n,r)n能被b整除,并且r也能被b整除,则qn也能被b整除 qn+r也能被b整除而m=qn+r,即m也能被b整除,所以a=b 例如计算 gcd(546, 429) gcd(546, 429)546=1*429+117 =gcd(429, 117) 429=3*117+78 =gcd(117, 78) 117=1*78+39 =gcd(78, 39) 78=2*39 =39 利用辗转相除法求最大公约数的步骤如下: (1):用较大的数m除以较小的数n得到一个商和一个余数;(2):若=0,则n为m,n的最大公约数;若≠0,则用除数n除以余数得到一个商和一个余数;(3):若=0,则为m,n的最大公约数;若≠0,则用除数除以余数得到一个商和一个余数;…… 依次计算直至=0,此时所得到的即为所求的最大公约数。 (二)更相减损术与辗转相除法的对比研究 对于这两种算法,都需要用循环结构去实现,从运算形式上去分析比较两种方法的异同优劣,我们倾向于认为更相减损术时效性更好:因为减法比除法更易于操作。但也有这样的例子如求2和1000000的最大公约数,用辗转相除法只需1步,而更相减损术确需要很多步。又例如求9586和9831的最大公约数用辗转相除法只需要6步得到最大公约数1。9831=9581*1+245;9586=245*39+31;245=31*7+28;31=28*1+3;28=3*9+1;3=1*3+0。而用更相减损术(9586,9831);(9856,245);(9341,245);(8096,245),(7851,245)…同样很繁琐,当然这只是两个比较特殊的例子,并不能由此定论辗转相除法比更相减损术更简洁。为了比较两种算法哪种更高效,由高二29班李艺同学对这两种算法结合计算机编程操作,通过计算机编程测试运用两种不同方法时的效率如下 //getdata #include stdio.h #include stdlib.h #include time.h int n,m; int gcd(int a,int b) { int tmp; while(b!=0){ tmp=a%b; a=b; b=tmp; } return a; } int main() { freopen(config.txt,r,stdin); scanf(%d%d,n,m); fclose(stdin); freopen(in.txt,w,stdout); printf(%d\n,n); // srand(unsigned(time(NULL))); for(int i=1;i=n;++i) printf(%d %d\n,rand()%m+1,rand()%m+1)

文档评论(0)

maritime5 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档