1. 程式人生 > >求a,b最大公約數的最快演算法

求a,b最大公約數的最快演算法

看到這道題最容易想到的是這個演算法:

int fun(int a, int b){
    int i;
    if(a<b)i=a;
    else i=b;
    for(;;i++){
        if((a%i)==0&&(b%i)==0)
            return i;
    }
}       

很明顯這是一個時間複雜度為O(n)的演算法,很多地方可以優化。

經比較,最快的應該是歐幾里得的輾轉相除法:

設兩數為a、b(a>b),求a和b最大公約數(a,b)的步驟如下:用a除以b,得a÷b=qr1(0≤r1)。若r1=0,則(a,b)=b;若r1≠0,則再用b除以r1,得b÷r1=qr2 (0≤r2).若r2=0,則(a,b)=r1,若r2≠0,則繼續用r1除以r2,如此下去,直到能整除為止。其最後一個為被除數的餘數的除數即為(a, b)。

例如,123456 和 7890 的最大公因子是 6,這可由下列步驟看出:

這裡寫圖片描述

程式碼
int fun(int a, int b){
    if(b==0)
        return a;
    else
        return fun(b, a%b);
}//迭代函式