求a,b最大公约数的最快算法

来源:互联网 发布:网络悲伤情歌 编辑:程序博客网 时间:2024/06/06 06:51

看到这道题最容易想到的是这个算法:

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);}//迭代函数
原创粉丝点击