欧几里得算法求解最大公约数和最小公倍数
来源:互联网 发布:能不能做个编程的视频 编辑:程序博客网 时间:2024/05/29 18:06
欧几里得算法(Euclidean Algorithm)是求解最大公约数(greatest common divisor, 简写 GCD)的最常见的算法。按照辗转相除法的原理,欧几里得算法似乎天然就有递归的特征,即,此算法可以写成如下的递归调用(C/C++ 语言):
//求解最大公约数int GCD(int a, int b){int temp = a % b;if(temp) {GCD(b, temp);} else {return b;}}
注意到上面的递归调用是一个尾部递归,所以此算法可以优化成为一个循环,从而避免递归调用(函数的递归调用比循环的执行代价更高,所以应该尽量使用循环而非递归。具体内容可以参考编译原理之类的书)。 另外,最大公约数(GCD)与最小公倍数(least common multiple,简写 LCM)之间还存在关系:
【定理】 对于两个正整数 a 和 b,有
GCD(a, b) * LCM(a, b) == a * b
此定理的证明极其简单:假设 k = GCD(a, b),则 a 和 b 可以分别表示为
a == k * m;
b == k * n;
其中 m 和 n 是正整数,且 m 与 n 互质。则a * b == k^2 * m * n;
另一方面,显然 a 与 b 的最小公倍数为LCM(a, b) == k * m * n;
于是定理得证。于是,求最大公约数与最小公倍数的算法可以优化为下面的代码(C/C++ 语言):
//求解最大公约数int GCD(int a, int b){int temp;while(a % b) {temp = a % b;a = b;b = temp;}return b;}//利用最大公约数求解最小公倍数//定理:GCD(a, b) * LCM(a, b) == a * bint LCM(int a, int b){return a * b / GCD(a, b);}
0 0
- 欧几里得算法求解最大公约数和最小公倍数
- 欧几里得算法--最大公约数&最小公倍数
- 用欧几里得算法实现两个数的最大公约数和最小公倍数
- 用欧几里得算法求解最大公约数
- 如何求解最大公约数和最小公倍数
- 递归:最小公倍数和最大公约数求解
- 求解最大公约数和最小公倍数问题
- 最小公倍数和最大公约数的求解
- 最大公约数和最小公倍数的求解
- 最小公倍数和最大公约数求解方法
- HDOJ 最小公倍数(欧几里得算法求最大公约数)
- 算法系列__1__欧几里得算法求解最大公约数
- 最大公约数和最小公倍数算法
- 算法---最小公倍数和最大公约数
- 使用欧几里得定理求最大公约数和最小公倍数
- 使用欧几里得定理求最大公约数和最小公倍数
- 最大公约数、欧几里得算法与求解模线性方程
- 欧几里得求最大公约数,最小公倍数
- Netty4源码分析——框架总结
- poj 2424 Flo's Restaurant
- 需要的知识
- 游标使用基础
- Android动画进阶—使用开源动画库nineoldandroids——1
- 欧几里得算法求解最大公约数和最小公倍数
- 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- JS中实现上传文件至本地 IE
- 黑马程序员----0704期java基础班心得
- Golang Channel 整理
- oracle 临时表空间的增删改查
- 内核符号导出
- 异常1:在公司实习时使用myeclipse6.0,重新配置tomcat和jdk时出现的问题
- Little-endian or Big-endian