三種方法求解最大公約數
阿新 • • 發佈:2019-02-13
%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)))