序:
不少时候咱们要处理两个数的最大公因数,好比分数化简。所以须要一种高效率的方法找到最大公因数。markdown
朴素法:优化
void Gcd(int &a, int &b)
{
int i, j, curr = min(a,b);
//从两数最小值开始
for(unsigned j = 1; j != 21; ++j)
//先判断curr/1——curr/20是否是,会优化一些时间
{
i = curr/j;
if(a%i == 0 && b%i == 0)
{
a /= i;
b /= i;
return ;
}
}
for(unsigned i = min(a, b)/20-1; i != 0; --i)//暴力搜的范围减少到1/20
{
if(a%i == 0 && b%i == 0)
{
return i;
break;
}
}
}
数据很大的时候不要想不会RE。spa
原理:
利用展转相除法。
若a = x1 * m, b = x2 * m,则 x1-x2 = x3 * m。(x3 = x1-x2)
该方法即是利用该原理。code
源代码以下:class
int Gcd(int &a, int &b)//假定 b >= a
{
int i, x = b, y = a;
for(; i; )//当i == 0时,说明找到了最大公因数
{
i = x%y;
x = y;
y = i;
}
return x;//该最大公因数
}
自此结束。
箜瑟_qi 2017.04.20 11:08效率