C语言求最大公约数辗转相除法:原理、步骤与递归迭代两种写法
C语言求最大公约数辗转相除法(也称为欧几里得算法)是一种古老而有效的求两个整数的最大公约数()的方法。该算法基于这样一个事实:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。辗转相除法通过反复将较大的数替换为较小的数,直到两数相等,此时它们的最大公约数就是这两个数。
原理:
假设有两个整数a和b,其中a > b。那么a和b的最大公约数和b与a - b(假设a - b > 0)的最大公约数是相同的。这是因为,如果某个数能同时整除a和b,那么它也能整除b和a - b。反之亦然。通过不断地用较小的数替换较大的数,直到两数相等,此时的数就是它们的最大公约数。
步骤:
1. 假设有两个整数a和b,其中a > b。
2. 如果b等于0,那么a就是最大公约数,算法结束。
3. 否则,将a替换为b,将b替换为a - b(或b - a,取决于哪个数更小)。
4. 重复步骤2和3,直到b等于0。
递归写法:
c
include
int gcd(int a, int b) {
if (b == 0)
return a;
else
return gcd(b, a % b);
}
int main() {
int num1, num2;
printf("输入两个整数: ");
scanf("%d %d", &num1, &num2);
printf("这两个整数的最大公约数是: %d", gcd(num1, num2));
return 0;
}
迭代写法:
c
include
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main() {
int num1, num2;
printf("输入两个整数: ");
scanf("%d %d", &num1, &num2);
printf("这两个整数的最大公约数是: %d", gcd(num1, num2));
return 0;
}
在这两个示例中,我们都定义了一个名为`gcd`的函数,它接受两个整数作为参数,并返回它们的最大公约数。在`main`函数中,我们从用户那里获取两个整数,并打印出它们的最大公约数。
递归版本使用递归调用`gcd`函数,直到b等于0,此时a就是最大公约数。迭代版本使用一个循环,每次迭代都将a替换为b,将b替换为a和b的余数,直到b等于0。
这两种方法都可以有效地求两个整数的最大公约数,而且都基于辗转相除法的原理。

