求兩數的最大公因數

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

相關文章
相關標籤/搜索