天之道

享受编程的乐趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

欧几里得算法

Posted on 2011-09-17 02:00 hoshelly 阅读(2398) 评论(0)  编辑 收藏 引用 所属分类: C
辗转相除法,又名欧几里得算法,是求最大公约数的算法。

原理及其详细证明

  设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
  第一步:令c=gcd(a,b),则设a=mc,b=nc
  第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
  第三步:根据第二步结果可知c也是r的因数
  第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c】
  从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
  证毕。

用C表示则:

     int gcd(int a,int b)
  {
  int temp;
  if(a<b)/*交换两个数,使大数放在a上*/
  {
  temp=a;
  a=b;
  b=temp;
  }
  while(b!=0)/*利用辗除法,直到b为0为止*/
  {
  temp=a%b;
  a=b;
  b=temp;
  }
  return a;
  }





只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理