辗转相除法,也称为欧几里得算法,是一种用于求两个正整数最大公约数的算法。其基本原理如下:
1. 如果 `a` 大于 `b`,则用 `a` 除以 `b` 得到余数 `r`。
2. 如果 `r` 不为 `0`,则将 `b` 赋值给 `a`,将 `r` 赋值给 `b`,然后重复步骤1。
3. 如果 `r` 为 `0`,则 `b` 就是 `a` 和 `b` 的最大公约数。
这个算法基于以下数学定理:
两个整数 `a` 和 `b` 的最大公约数等于 `a` 除以 `b` 的余数 `r` 和 `b` 的最大公约数。
如果 `r` 为 `0`,则 `b` 就是 `a` 和 `b` 的最大公约数。
辗转相除法可以通过迭代或递归实现。以下是使用迭代和递归两种方法实现辗转相除法的示例代码:
迭代实现:
```c
int gcd(int a, int b) {
while (b) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
```
递归实现:
```c
int gcd(int a, int b) {
if (a % b == 0) {
return b;
} else {
return gcd(b, a % b);
}
}
```
使用这个算法,可以求出任意两个正整数的最大公约数。例如,求 `319` 和 `377` 的最大公约数,可以通过以下步骤:
1. `377 ÷ 319 = 1` 余 `58`
2. `319 ÷ 58 = 5` 余 `29`
3. `58 ÷ 29 = 2` 余 `0`
因此,`319` 和 `377` 的最大公约数是 `29`