最大公约数求解

来源:互联网 发布:java开源cms系统 编辑:程序博客网 时间:2024/06/01 09:43

方法一:辗转相除法

优点:代码简单,容易写。缺点:开销大,用时间多。

代码:

int  gcd(int a,int b){    return b==0?a:gcd(b,a%b);}


方法二:二进制算法

优点:速度快。

主要思想:

前提:a>b,分情况讨论:

1.a和b均为偶数,gcd(a,b)=2*gcd(a/2,b/2);

2.a为偶数b为奇数,gcd(a,b)=gcd(a/2,b);

3.a和b均为奇数,gcd(a,b)=gcd(a-b,b)

 

代码:

int gcd(int a,int b){    int t=1,c,d;    while(a!=b)    {        if(a<b)            swap(a,b);        if(!(a&1))//如果a为偶数 a&1=0        {            a>>=1;            c=1;//a为偶数的标志        }        else            c=0;        if(!(b&1))//如果b为偶数         {            b>>=1;            d=1;//b为偶数的标志        }        else            d=0;        if(c&&d)//a,b都为偶数            t<<=1;//公因子        else if(!c&&!d//a,b都为奇数            a-=b;    }    return t*a;}

方法三:

int gcd(int a,int b){    if(!a)        return b;    int c;    while(b)    {        c=b;        b=a%b;        a=c;    }    return a;}



 

0 0
原创粉丝点击