1. 程式人生 > >三種方法求解最大公約數

三種方法求解最大公約數

%greatest common divisor 最大公約數
clc;
clear;
%1.輾轉相除法(歐幾里得演算法):兩個正整數a和b(a>b),它們的最大公約數等於a除以b的餘數c和b之間的最大公約數。
a=250;
b=100;
c=1;
while(c~=0)
   c=mod(a,b); 
   if(c==0)
      b 
   else
       a=b;
       b=c;
   end
end

%2.更相減損術(出自九章算術):兩個正整數a和b(a>b),它們的最大公約數等於a-b的差值c和較小數b的最大公約數。
%  避免了大整數取模的效能問題
a=250;
b=100;
c=1;
while(c~=0)
    if(a>b)
        c=a-b; 
        if(c==0)
             a
        end
        a=b;
        b=c;
    else
        c=b-a;
        if(c==0)
             a
        end
        b=a;
        a=c;
    end
end
%3. 歐幾里得演算法(輾轉相除法)+更相減損術

function c= Gcd(a,b)
if(a>b)
    if(mod(a,2)==0&&mod(b,2)==0)
        c=2*Gcd(a/2,b/2);
    elseif(mod(a,2)~=0&&mod(b,2)==0)
        c=Gcd(a,b/2);
    elseif(mod(a,2)==0&&mod(b,2)~=0)
        c=Gcd(a/2,b);
    else
        c=Gcd(a-b,b);
    end
elseif(a<b)
    c=Gcd(b,a);
else
    c=a;
end
end


最後總結一下上述所有解法的時間複雜度:

1.暴力列舉法:時間複雜度是O(min(a, b)))-->(略)

2.輾轉相除法:時間複雜度不太好計算,可以近似為O(log(max(a, b))),但是取模運算效能較差。

3.更相減損術:避免了取模運算,但是演算法效能不穩定,最壞時間複雜度為O(max(a, b)))

4.更相減損術與移位結合:不但避免了取模運算,而且演算法效能穩定,時間複雜度為O(log(max(a, b)))