分数 5
作者 王跃萍
单位 东北石油大学
递归法求两个数的最大公约数。
函数接口定义:
int gys(int m,int n);
其中 m
和 n
都是用户传入的参数。函数用递归法求m
和 n
的最大公约数。
裁判测试程序样例:
#include <stdio.h>
int gys(int m,int n);
int main()
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",gys(m,n));
return 0;
}
/* 请在这里填写答案 */
输入样例:
24 16
输出样例:
8
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
求最大公约数(Greatest Common Divisor, GCD)有几种常用的方法,包括欧几里得算法(Euclidean Algorithm)和更相减损术(辗转相除法)。这里,我将介绍欧几里得算法,因为它是最常用且易于理解的算法。
欧几里得算法(Euclidean Algorithm)
欧几里得算法的基本思想是:对于两个整数a和b(a > b),它们的最大公约数与b和a mod b的最大公约数相同。这个性质可以一直递归地应用,直到其中一个数为0,此时另一个数就是它们的最大公约数。
以下是欧几里得算法的伪代码:
function gcd(a, b)
while b ≠ 0
t = b
b = a mod b
a = t
return a
更相减损术(辗转相除法)
更相减损术是另一种求最大公约数的方法,它基于的原理是:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。具体步骤是:
- 如果a和b相等,则它们的最大公约数就是a或b。
- 否则,如果a大于b,则a减b,并更新a的值为a-b;如果b大于a,则b减a,并更新b的值为b-a。
- 重复步骤2,直到a和b相等,此时得到的值就是最大公约数。
欧几里得算法C程序如下:
// 计算两个整数的最大公约数
int gys(int m, int n) {
// 如果 n 为 0,则 m 就是最大公约数
if (n == 0) {
return m;
}
// 递归调用 gys 函数,传入 n 和 m 除以 n 的余数
return gys(n, m % n);
}