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

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

int fun(int a, int b){
	int i;
	if(a

很明显这是一个时间复杂度为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,这可由下列步骤看出:

求a,b最大公约数的最快算法_第1张图片

代码
int fun(int a, int b){
	if(b==0)
		return a;
	else
		return fun(b, a%b);
}//迭代函数

你可能感兴趣的:(数据结构与算法)