现在的位置: 首页 > 竞赛 > 正文

第10章 数学概念与方法

2011年04月10日 竞赛 ⁄ 共 1243字 ⁄ 字号 暂无评论

配合《算法竞赛入门经典》第10章

最大公约数和最小公倍数

两个数的最大公约数通常写成gcd(a, b),最小公倍数写成 lcm(a, b)。

最大公约数*最小公倍数 = 两数的乘积 gcd(a,b) * lcm(a,b) = a*b

求两个数的最大公约数最有名的方法就是辗转相除法, 又名欧几里德算法(Euclidean algorithm)。它是已知最古老的算法, 其可追溯至3000年前。

计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147:
1071 = 2 × 462 + 147.
然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21:
462 = 3 × 147 + 21.
再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数:
147 = 7 × 21 + 0.
此时,余数是0,所以1071和462的最大公约数是21。

在C语言中,使用递归求 gcd 是极为简洁又高效的办法。

抱歉!评论已关闭.