一、最大公约数概念
数学中,Y 可以被A、B同时整除,Y的最大值即为A、B的最大公约数(最大公因数)
二、最大公约数算法
2.1 四种算法
最大公约数有四种算法:
【1】欧几里得算法(辗转相除法)
【2】更相减损术
【3】除穷举法
【4】减穷举法
效率最高的为【欧几里得算法】,所以只了解它即可,实际应用中可以封装成工具类,需要时直接调用,下面附上网友关于四种算法的统计数据:
结果1:(百万级)
GCD of (4456836, 6457982):
辗转相除法: 2 (15次, 0.000s)
更相减损术: 2 (52次, 0.001s)
除穷举法: 2 (2228418次, 2.023s)
减穷举法: 2 (4456835次, 4.093s)
结果2:(千万级)
GCD of (12689792, 12690312):
辗转相除法: 8 (6次, 0.000s)
更相减损术: 8 (24418次, 0.022s)
除穷举法: 8 (1586224次, 1.471s)
减穷举法: 8 (12689785次, 12.072s)
结果3:(亿级)
GCD of (135034734, 749274957):
辗转相除法: 3 (19次, 0.000s)
更相减损术: 3 (112次, 0.000s)
除穷举法: 3 (45011578次, 41.658s)
减穷举法: 3 (135034732次, 129.202s)
2.2 欧几里得算法(辗转相除法)
欧几里得算法,主要依靠以下数学结论:
已知a,b,c为正整数,若a除以b余c,则GCD(a,b)=GCD (b,c)
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 ÷ 615 = 3 (余 152)
615 ÷ 152 = 4(余7)
152 ÷ 7 = 21(余5)
7 ÷ 5 = 1 (余2)
5 ÷ 2 = 2 (余1)
2 ÷ 1 = 2 (余0)
至此,最大公约数为1
三、Java实现最大公约数
利用递归特性,实现欧几里得算法
public int gcd(int a, int b) {
//简化代码,保证a比b大
if (a < b) {
return gcd(b, a);
}
int c = a % b;
if (c == 0) {
return b;
} else {
return gcd(b, c);
}
}