最大公约数 GCD
1.最大公约数的一般求法
分析一下:
最大公约数也指最大公因数,大致的意思是指对两个 整数
进行因子分解,共同的因子并且是最大的,就是最大公约数 。举个例子
56 : 1, 2, 4, 7, 8, 14, 28, 56,
88:1, 2, 4, 8, 11, 22, 44, 88,
56 和 88 的最大公约数为 8
我们注意到56小于88,56的最大因子是自己,因此可以想到这样一种算法,遍历56~1,看其中是否都能够被56和88整除
代码整理:
int solve(int a,int b)
{
sort(a,b); //排序 a < b,头文件<algorithm>
for (int i = b;i > 0;--i)
if (a%i == 0 && b%i == 0)
return i;
}
👆,时间复杂度为0(n),平均复杂度为0(n/2),空间复杂度0(1)
可能你发现不到更好的算法,但是确实存在的,那就是 GCD
算法(Greatest Common Divisor),下面进入正题
2.GCD——辗转相除法
分析一下:
可能你没有听说过GCD算法,但是受过九年义务教育的你😊,应该听说过它的另一个名字——辗转相除法,具体百科去。
辗转相除法是讲求A和B的最大公约数,可以这样求,如下图:
代码整理:
int solve(int a,int b)
{
r = a % b;
a = b;
b = r;
while (r != 0)
{
r = a % b;
a = b;
b = r;
}
return a;
}
我们可以发现👆的代码中出现复用现象,并且均是在 b = r 后判断 r 是否为零,因此可以用 b 代替 r 进行判断,如下:
int solve(int a,int b)
{
while(b != 0)
{
r = a % b;
a = b;
b = r;
}
return a;
}
当然喜欢递归的同学,这里也能够写成递归形式,如下:
int solve(int a,int b)
{
return (b != 0)?solve(a%b):a;
}