欧几里得算法求最大公约数

前言

个人小记


一、公式:

gcd(a,b)=gcd(b,a%b)
欧几里得算法求最大公约数是不断缩小数的范围来找到最大公约数。
当a>b时,b>a%b,缩小数的范围;
当a

二、公式证明(乘号省略)

1、证明c为a,b的一个公约数
设gcd(b,a%b)=c;
则有b=cx, a%b=cy;(c为最大公约数,必有一个整数与公约数c的乘积等于原本的数)
因为a%b=cy;
则有cy+kb=a;(b的一个倍数+余数cy=a)
a=cy+kcx=(y+kx)c;(将b代入)
整理得:
a=(y+kx)c,
b=cy;
所以a,b的一个公约数为c;
2、证明c为a,b的最大公约数
由上面可知,要证明c为a,b的最大公约数,可以证明gcd(x,y+kx)=1既为互质,所以为最大公因数;
因为有b=cx,a%b=cy且不要忘记c为b,a%b的最大公约数;
所以x,y互质,即gcd(x,y)=1;
设gcd(x,y+kx)=d;
有x=dm
y+kx=dn;
y+kdm=dn;
y=dn-kdm=(n-km)d;
整理得:
x=dm
y=(n-km)d;
因为x,y互质,即gcd(x,y)=1;
所以d=1;
所以gcd(x,y+kx)=1即c为a,b的最大公约数;
所以有gad(a,b)=gad(b,a%b)证明完毕;

三、递归实现

代码如下:

#include 

int gcd(int a, int b)
{
	if (b == 0)return a;
	return gcd(b, a % b);
}

int main()
{
	int a, b;
	while(scanf("%d%d", &a, &b) != EOF)
	{
		printf("%d与%d的最大公约数为%d\n", a, b, gcd(a, b));
	}
	return 0;
}

2.示例输出

4 8
48的最大公约数为4
24 3
243的最大公约数为3
1 1
11的最大公约数为1
^Z
^Z
^Z

C:\Users\lenovo\Desktop\test\Project1\test\x64\Debug\test.exe (进程 21444)已退出,代码为 0。
按任意键关闭此窗口. . .

你可能感兴趣的:(算法)