青岛园林学校:★经典问题—欧几里得求最大公约数
来源:百度文库 编辑:中财网 时间:2024/05/05 04:22:16
问题:快速求取正整数a,b的最大公约数?
欧几里得算法(又称辗转相除法)
定理:gcd(a,b) = gcd(a,a mod b)
证明:对于任何正整数a,b。如果a>b,都有a=k*b+r 即r=a-k*b => r=a mod b.
假设d为a,b的公约数,则a=a1*d,b=b1*d。
而r=a1*d-k*b1*d=(a1-k*b1)*d => d也是r的约数 => d也是(a,r)的公约数
则说明(a,b)的公约数也就是(a,r)的公约数。因此gcd(a,b)=gcd(a,a mod b)。
Java代码
- /**
- * 求最大公约数
- *
- * 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。
- * 其计算原理依赖于下面的定理:gcd(a,b) = gcd(b,a mod b)
- *
- * @author heartraid
- */
- public class EuclidDivisor {
- public static int getDivisor(int a,int b){
- if(a%b==0) return b;
- if(b%a==0) return a;
- return a>=b?getDivisor(a,a%b):getDivisor(a,b%a);
- }
- public static void main(String[] args) {
- System.out.println(EuclidDivisor.getDivisor(12,8));
- }
- }
/** * 求最大公约数 * * 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。 * 其计算原理依赖于下面的定理:gcd(a,b) = gcd(b,a mod b) * * @author heartraid */public class EuclidDivisor {public static int getDivisor(int a,int b){if(a%b==0) return b;if(b%a==0) return a;return a>=b?getDivisor(a,a%b):getDivisor(a,b%a);}public static void main(String[] args) {System.out.println(EuclidDivisor.getDivisor(12,8));}}
引申: 快速求取正整数a,b的最小公倍数?首先求出a,b的最大公约数c=(a,b),然后用a*b/c 即可。
使用欧几里得算法,求给定两个整数的最大公约数。
求最大公约数
关于求最大公约数出现的问题
如何求最大公约数?
如何求最大公约数?
求各组的最大公约数
求经典开门问题!
怎么求最大公约数和最小公倍数
怎么求最大公约数和最小公倍数
求两个最大公约数的算法
编程求最大公约数与最小公倍数
最大公约数
ABCD四个数,已知AC最大公约数72,BD最大公约数90,求四个数的最大公约数是多少?
两个数求最大公约数公式是什么???
求n个自然数的最大公约数
怎么求最小公倍数和最大公约数啊???
谁知道假分数怎么求最小公倍数和最大公约数
在Pascal中,如何求高精度最大公约数
请教:C语言求最大公约数和最小公倍数
关于用C求最大公约数的题目!
C++求算两个数的最大公约数
欧几里得的求学历程?
A B的最大公约数是72,C D的最大公约数是90,求这4个数的最大公约数是几
两个数5比4,他们的最大公约数和最小公倍数的和是803,求最大公约数