二进制GCD算法 减少%的时间消耗

/*

二进制求最大公约数。
由于传统的GCD,使用了%,在计算机运行过程中
要花费大量的时间,所以,采取二进制的求法,来减少时间的消耗。

算法:

当a,b都是偶数时: gcd(a,b)=2*gcd(a/2,b/2);
当a,b一奇一偶时: if(a&1) gcd(a,b)=gcd(a,b/2);
                  else    gcd(a,b)=gcd(a/2,b);
当a,b都是奇数时:  if(a>b)
                     gcd(a,b)=gcd( (a-b)/2, b);
                  else
                     gcd(a,b)=gcd( a,(b-a)/2);


其实就是把偶数的/2,而且奇数-奇数=偶数。
*/

 1 #include<stdio.h>
 2 
 3 int Binary_GCD(int a,int b)
 4 {
 5     int c=1;
 6     while(a-b)
 7     {
 8         if(a&1)
 9         {
10             if(b&1)
11             {//都是奇数
12                 if(a>b) a=(a-b)>>1;
13                 else b=(b-a)>>1;
14             }
15             else //一奇数一偶数
16                 b=b>>1;
17         }
18         else//a 是偶数
19         {
20             if(b&1) a=a>>1;
21             else
22             {
23                 c=c<<1;b=b>>1;a=a>>1;
24             }
25         }
26     }
27     return c*a;
28 }
29 
30 int main()
31 {
32     int n,m;
33     while(scanf("%d%d",&n,&m)>0)
34     {
35         printf("%d\n",Binary_GCD(n,m));
36     }
37     return 0;
38 }

 

posted @ 2013-08-10 10:31  芷水  阅读(418)  评论(0编辑  收藏  举报