最大公约数的两种求法

转自:http://blog.csdn.net/young_gy/article/details/46688511

最大公约数

定义

所谓最大公约数,即是两个正整数都可以整除的最大整数。

特性

最大公约数,是两个数共有的素因数乘积。 
例如: 
462 = 2*3*7*11 
1071=3*3*7*17 
所以,最大公约数为3*7=21

辗转相除法

辗转相除法首先出现在欧几里得的《几何原本》,在中国则可以追溯到东汉出现的《九章算术》。

其核心思想是:每次取两个数中最小的数和最大数除以最小数的余数,重复进行直到余数为0,这时两个数相等,为最大公约数。

举例如下: 
(200,160)-》(160,40)-》(40,0)-》40为最大公约数

图形化的描述如下图: 
这里写图片是描述

求一个长方形的长和宽的最大公约数,就相当于在里面填上面积最大的小正方形,不断地辗转相除,最后得到可以划分长方形的最大正方形。

最大公约数的编程求解

迭代法

int gy(int a,int b){	int t,r;	if(a<b) t=a,a=b,b=t;	r=a%b;	while(r)	{		a=b;		b=r;		if(a<b) t=a,a=b,b=t;		r=a%b;	}	return b;}		   	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

以上肯定能达到终止条件,但是问题规模大的时候速度会很慢。

递归法

long gy(long n,long m)//递归求最大公约数 
{
	long temp;
	if(n<m) temp=n,n=m,m=temp;
	if(m==0)
		return n;
	else
		return gy(m,n%m);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

对以上代码做一下简要说明: 
1. 每次递归的内容是获得两个较小的数和大数除以小数的余数。分三种情况,一种是gcd(max,min)=gcd(min,max%min)正好符合情况;另一种是gcd(min,max) = gcd(max,min%max=min)正好转换到第一种情况,第三种两者相等不言。 
2. 递归的终止条件是余数为0,易证:无论如何,总会达到终止条件(两个素数的极限为1)


posted @ 2017-03-16 07:35  X_na  阅读(600)  评论(0编辑  收藏  举报