辗转相除法——求最大公约数的好方法

辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。辗转相除法处理大数时非常高效,它需要的步骤不会超过较小数的位数(十进制下)的五倍。

辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。

例如,求(319,377):
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29),
∴ (319,58)=(58,29);
∵ 58÷29=2(余0),
∴ (58,29)= 29;
∴ (319,377)=29。

C++实现

使用循环

//求最大公约数,辗转相除法
int gcd(int a, int b)
{ 
	while(b!=0){
		int tmp=a%b;
		a=b;
		b=tmp;
	}
	return a;
}

使用递归

//求最大公约数,辗转相除法
int gcd(int a, int b)
{
	return (b==0) ? a : gcd(b, a%b);
}


posted @ 2014-09-04 14:37  东邪他爹  阅读(504)  评论(0编辑  收藏  举报