递归求法:
迭代求法: 1
2
3
4
5//用的最多
int gcd(int a, int b)//快速算最大公因数
{
return !b ? a : gcd(b, a % b);
}1
2
3
4
5
6
7
8
9int gcd(int a, int b) {
while (b != 0) {
int tmp = a;
a = b;
b = tmp % b;
}
return a;
}
C++14 可用 __gcd (a, b)
大数的 gcd: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27Big gcd(Big a, Big b) {
// 记录a和b的公因数2出现次数
int atimes = 0, btimes = 0;
while (a % 2 == 0) {
a >>= 1;
atimes++;
}
while (b % 2 == 0) {
b >>= 1;
btimes++;
}
for (;;) {
// a和b公因数中的2已经计算过了,后面不可能出现a,b均为偶数的情况
while (a % 2 == 0) {
a >>= 1;
}
while (b % 2 == 0) {
b >>= 1;
}
if (a == b) break;
// 确保 a>=b
if (a < b) swap(a, b);
a -= b;
}
return a << min(atimes, btimes);
}