zoukankan      html  css  js  c++  java
  • 二进制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
    ",Binary_GCD(n,m));
    36     }
    37     return 0;
    38 }
  • 相关阅读:
    模拟赛12-10
    uva-11235
    中国剩余定理
    待学算法
    A
    动态逆序对
    [BZOJ3011][Usaco2012 Dec]Running Away From the Barn
    题目1007:奥运排序问题(结构体排序)
    题目1006:ZOJ问题(字符串处理)
    题目1005:Graduate Admission(结构体排序)
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3249730.html
Copyright © 2011-2022 走看看