求最大公约数的几种方法

解法一的问题在于计算复杂的大整数除法运算,而解法二虽然将大整数的除法运算转换成了减法运算,降低了计算的复杂性,但迭代次数太多。
如果y=k*y1, x=k*x1.那么有f(y,x)=k*f(y1,x1)。
如果x=p*x1,假设p是素数,并且y不能被p整除,那么f(x,y)=f(p*x1,y)=f(x1,y)。
取p=2
若x,y均是偶数,f(x,y)=2*f(x>>1,y>>1);
若x为偶数,y为奇数,f(x,y)=f(x>>1,y);
若x为奇数,y为偶数,f(x,y)=f(x,y>>1);
若x,y均是奇数,f(x,y)=f(y,x-y).

时间复杂度为O(log(max(x,y))。

//求最大公约数的几种方法 
#include <stdio.h>
bool IsEven(int x)
{
    if((x & 0x1) == 0)
    {
        return true;
    }

    return false;
}
int gcd0(int x, int y)            //方法一使用大量取余运算 
{
    return (!y) ? x : gcd0(y, x % y);
}

int gcd1(int x, int y)         //方法二可能迭代次数过多 
{
    if(x < y)
    {
        return gcd1(y, x);
    }
    if(y == 0)
    {
        return x;
    }
    else
    {

        return gcd1(x - y, y);
    }
}

int gcd2(int x, int y)         //方法三使用位运算,效率更高 
{
    if(x < y)
        return gcd2(y, x);
    if(y == 0)
        return x;
    else
    {
        if(IsEven(x))
        {
            if(IsEven(y))
            {
                return (gcd2(x >> 1, y >> 1) << 1);
            }
            else
            {
                return gcd2(x >> 1, y);
            }
        }
        else
        {
            if(IsEven(y))
            {
                return gcd2(x, y >> 1);
            }
            else
                return gcd2(y, x - y);
        }
    }
}


int main()
{
    int x = 12;
    int y = 8;
    printf("第一种:%d\t,第二种:%d\t,第三种:%d\t", gcd0(x, y), gcd1(x, y), gcd2(x, y));
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值