求最大公因数的两种算法及 C 语言实现
更相减损术
《九章算术》云:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
即:将较大数减去较小数,将所得的差与较小数进行同样操作,直到减数与差相等,此数即为最大公因数。
- 递归
int gcd(int a, int b) {
if (a == b)
return a;
if (a > b)
return gcd(a - b, b);
return gcd(b, a); // 若 a < b, 则交换 a b, 直接进入下一层递归
}
- 循环
int gcd(int a, int b) {
while (a != b) {
if (a > b) { // 必需条件: a > b
a = a - b;
} else { // 若 a < b, 则交换 a b
// 不依赖第三个变量的交换
a = a - b;
b = a + b;
a = b - a;
}
}
return a;
}
辗转相除法
将较大数除以较小数,将余数和较小数进行同样操作,直到余数为零,除数即为最大公因数。
- 递归
int gcd(int a, int b) {
if (b == 0)
return a;
if (a > b)
return gcd(b, a % b);
return gcd(a, b % a);
}
- 循环
int gcd(int a, int b) {
int t;
while (b != 0) {
if (a > b) { // 必需条件: a > b
t = a;
a = b;
b = t % b;
} else { // 若 a < b, 则交换 a b
// 不依赖第三个变量的交换
a = a - b;
b = a + b;
a = b - a;
}
}
return a;
}