转自: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
r=a%b;
while(r)
{
a=b;
b=r;
if(a
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 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)