算法笔记 -- 辗转相除法
2022-01-19 15:26:30 357 字 · 约 1 分钟 # algorithm

今天突然看到一题有关求最大公约数的算法,竟然用暴力没法求出来,就来复习一下算法了🤣。

整除

首先我们要职的gcd是干什么的,gcd一般是用在求两个整数的最大公约数,而说到约数又要先提到除法,对于整数中的除法,我们一般有如下通用表示形式:

,其中

,则称能够被整除或称能够整除,记作,否则说明不能被整除。

其中整除具有传递性:

,则

组合性:

,对于任意,都有

欧几里得算法

稍微了解了整除的定义后,我们来看算法中著名的欧几里得算法:

证明步骤如下所示:

首先我们不妨假设,则

又因为此时有公约数,。不妨设公约数为,则。由①可得。又因为,故。设,故

又因为,故

附上cpp代码实现

1
2
3
4
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}