比较求最大公因数的最快算法

本文介绍了两种计算最大公约数的方法:一种是经典的欧几里得算法,另一种是利用二进制位操作的算法。通过对比这两种方法,文章讨论了它们各自的优劣,并指出在某些情况下使用二进制位操作的算法可以更高效地解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* 迭代法(递推法):欧几里得算法,计算最大公约数 */  
int gcd(int m, int n)  
{  
    while(m>0)  
    {  
        int c = n % m;  
        n = m;  
        m = c;  
    }  
    return n;  
} 


int cd(int x, int y)
{
	int  i, j, t;
	if (x == 0)  
		return  y;
	if (y == 0)  
		return  x;
	for (i = 0; 0 == (x & 1);x >>= 1, ++i);
	for (j = 0; 0 == (y & 1);y >>= 1, ++j);
	if (j < i) 
		i = j;
	for (;;)
	{
		if (x < y) 
			t = y, y = x, x = t;
		if (0 == (x -= y))  
			return  y << i;
		for (;0 == (x & 1);x >>= 1);
	}
}

上述两种算法都是求最大公约数,但是谁更快呢?前者是经常使用的,而且代码简单

但是后者是二进制的按位操作,似乎更快,实际结果也是后者更快

在一些题目中掌握后者基本上就与超时无缘了,但是,这代码。。。。真的很难懂。

唉,菜鸡(我)。

还有一种二进制加速gcd,了解一下

int gcd(int a,int b)
{
    while(b^=a^=b^=a%=b);
    return a;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值