二进制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 }

 

转载于:https://www.cnblogs.com/tom987690183/p/3249730.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值