最大公约数(欧几里得算法)

本文介绍了如何使用辗转相除法(欧几里得算法)求解两个正整数的最大公约数,并给出了简洁的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正整数a与b的最大公约数指的是a与b的所有公约数中最大的那个公约数,如4和6的最大公约数是2。

一般用gcd(a,b)来表示a,b的最大公约数,而求解最大公约数常用的欧几里得算法(即辗转相除法)。

 

欧几里得算法基于下面这个定理:

设a、b均为正整数,则gcd(a, b) = gcd(b, a%b)。

 

如果a<b,那么定理的结构就是将a和b交换;如果a>b,那么通过这个定理总可以将数据规模变小,并且减小的非常快。这样似乎可以很快就得到结果,只要还需要一个东西:递归边界,即数据规模减小到什么程度使得可以算出结果来。很简单,总所周至:0和任意一个整数a的最大公约数都是a(注意:不是0),这个结论就可以当作递归的边界。由此很容易想到将其写为递归的形式,因为递归的两个关键已经得到:

1.递归式:gcd(a, b) = gcd(b, a%b).

2.递归边界:gcd(a, 0) = a.

于是可以得到下面的求解最大公约数的代码:


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

更简洁的写法是:

int gcd(int a, int b){
  return !b ? a : gcd(b, a%b);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值