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

前言

个人小记


一、公式:

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
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。
按任意键关闭此窗口. . .

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值