0
0
已采纳
许金夫
初级天翼
初级天翼
用(a,b)表示a和b的最大公约数
有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c)。 (证明过程请参考其它资料)
例如:求gcd(319,377):
∵ 377÷319=1(余58)
∴gcd(377,319)=gcd(319,58);
∵ 319÷58=5(余29),
∴ gcd(319,58)=gcd(58,29);
∵ 58÷29=2(余0),
∴ gcd(58,29)= 29;
∴ gcd(319,377)=29.
0
高梓荣
新手天翼
新手天翼
/* 迭代法(递推法):欧几里得算法,计算最大公约数 */
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;
}
0
0
0
0