前言
个人小记
一、公式:
gcd(a,b)=gcd(b,a%b)
欧几里得算法求最大公约数是不断缩小数的范围来找到最大公约数。
当a>b时,b>a%b,缩小数的范围;
当a<b时,a%b=a,则有gcd(b,a%b)=gcd(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 <stdio.h>
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
4与8的最大公约数为4
24 3
24与3的最大公约数为3
1 1
1与1的最大公约数为1
^Z
^Z
^Z
C:\Users\lenovo\Desktop\test\Project1\test\x64\Debug\test.exe (进程 21444)已退出,代码为 0。
按任意键关闭此窗口. . .