求a,b最大公約數的最快演算法
阿新 • • 發佈:2019-02-20
看到這道題最容易想到的是這個演算法:
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);
}//迭代函式