序:
不少時候咱們要處理兩個數的最大公因數,好比分數化簡。所以須要一種高效率的方法找到最大公因數。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效率