欧几里得算法(辗转相除法)
- 欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。
- 辗转相除法依赖于以下定理:
两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
定理证明:
- 假设现在要求整数
a
,b
的最大公约数,其中a > b
;- 记它们的余数为
r = a % b
,我们容易得到kb + r = a
(其中k为正整数),也即r = a - kb
;(注意这里r不能为0,因此a不能整除b) - 定义
m
为a
和b
的(任意)公约数;
- 记它们的余数为
- 那么
r / m = (a - kb) / m = a / m + kb / m
;容易知道等式右边的结果是整数,因此**m
也能整除r
,因此m也是r的公约数**。 - 综上所述,a和b的公约数也必然是它们的余数r的公约数。因此a与b的最大公约数等于a与r的最大公约数,也等于b与r的最大公约数。
算法实现
int maxNum(int a, int b) {
while(true) {
if (a % b == 0) return b;
else if(b % a == 0) return a;
// 将较大的那个数替换为它们的余数
if(a > b) a = a % b;
else b = b % a;
}
}