Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105194
  • 博文数量: 18
  • 博客积分: 226
  • 博客等级: 二等列兵
  • 技术积分: 183
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-24 18:31
文章分类

全部博文(18)

文章存档

2013年(9)

2012年(7)

2011年(2)

我的朋友

分类: C/C++

2012-11-18 20:48:59

 
1、欧几里得方法(euclid)
     思想:gcd(a,b)=gcd(b,r)  r = a % b;
     欧几里得算法即是要证明gcd(a,b)=gcd(b,r)。证明:
     1.令c=gcd(a,b),则有a=mc,b=nc。因为r=a mod b,固有r=a-kb=mc-knc=(m-kn)c,所以m-kn和c为r的因数。     
     2.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】
     3.gcd=(b,r)=c=gcd(a,b)。
     

点击(此处)折叠或打开

  1. int Euclid(int a,int b){
  2.     while(a=a%b){
  3.         a=a+b;
  4.         b=a-b;
  5.         a=a-b;
  6.     }
  7.     return b;
  8. }
 递归:

点击(此处)折叠或打开

  1. int euclid(int x, int y)

  2.     if (x < y) x <-> y;
  3.     if (y) return euclid(y, x%y);
  4.     else return x;
      迭代:

点击(此处)折叠或打开

  1. int euclid(int x, int y)
  2. {
  3.     while(a = a % b)
  4.     {
  5.         a ^=b;
  6.         b ^= a;
  7.         a ^= b;
  8.      }
  9.      return b;
  10. }
     迭代与递归的区别:一个函数进行自身某种法则的复合是迭代;迭代和递归都是用循环结构
     对于迭代,其实解决问题的方法是不断的修改迭代变量的值,直到碰到令循环失败的迭代变量;递归则是,不断产生原始问题的简化副本,直到问题简单到基本情况。递归使用重复调用函数的机制,不断为程序申请栈空间以存放函数数据,使算法的时间和空间复杂度很大,而迭代则是在循环体内部进行的,就避免了使用递归带来的问题。从理论上来讲,能使用递归解决的问题,就能使用迭代来解决。
2、二进制最大公约数算法
     思想: a、b 均为偶数, gcd(a,b) = 2 * gcd(a/2, b/2)
               a为偶数,b为奇数, gcd(a,b) = gcd(a/2 , b)
               a为奇数,b为偶数,gcd(a,b) = gcd(a, b/2)
               a、b均为奇数, gcd(a,b) = gcd((a-b)/2, b)
     经典c代码实现一:

点击(此处)折叠或打开

  1. int gcd(int a,int b){
  2.     int c=1;
  3.     while(a-b){
  4.         if(a&1){
  5.             if(b&1){
  6.                 if(a>b)a=(a-b)>>1;
  7.                 else b=(b-a)>>1;
  8.              }
  9.              else b>>=1;
  10.          }
  11.          else{
  12.              if(b&1)a>>=1;
  13.              else
  14.              {
  15.                  c<<=1,a>>=1,b>>=1;
  16.              }
  17.        }
  18.     }
  19.     return c*a;
  20. }
     经典c代码实现二
          

点击(此处)折叠或打开

  1. int gcd(int u,int v){
  2.     int k=1,t;
  3.     while(~u&1 && ~v&1){
  4.        k<<=1,u>>=1,v>>=1;
  5.     }
  6.     t=(u&1)?-v:u>>1;
  7.     do{
  8.        while(~t&1)t>>=1;
  9.        if(t>0)u=t;else v=-t;
  10.     }while(t=u-v);
  11.     return u*k;
  12. }

     经典C代码实现三
     

点击(此处)折叠或打开

  1. int gcd(int x,int y)
  2. {
  3.      int i,j,t;
  4.      if(x==0) return y;
  5.      if(y==0) return x;
  6.      for(i=0; 0==(x & 1); x>>=1,++i);
  7.      for(j=0; 0==(y & 1); y>>=1,++j);
  8.      if (j < i) i = j;
  9.      while(1)
  10.      {
  11.           if (x < y) t = y,y = x,x = t;
  12.           if (0 == (x -= y)) return y << i;
  13.           for (; 0 == (x & 1 );x >>= 1 );
  14.      }
  15. }

博文中代码的实现是参考的现有网上的朋友贡献的,链接地址忘了,感谢你们。
阅读(2668) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~