三种方法求解最大公约数

来源:互联网 发布:阿里巴巴软件开发 编辑:程序博客网 时间:2024/06/15 05:33
%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;   endend%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;    endend%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);    endelseif(a<b)    c=Gcd(b,a);else    c=a;endend

最后总结一下上述所有解法的时间复杂度:

1.暴力枚举法:时间复杂度是O(min(a, b)))-->(略)

2.辗转相除法:时间复杂度不太好计算,可以近似为O(log(max(a, b))),但是取模运算性能较差。

3.更相减损术:避免了取模运算,但是算法性能不稳定,最坏时间复杂度为O(max(a, b)))

4.更相减损术与移位结合:不但避免了取模运算,而且算法性能稳定,时间复杂度为O(log(max(a, b)))

0 0
原创粉丝点击