本文主要是介绍6-5 递归法求两个数的最大公约数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
分数 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);
}
这篇关于6-5 递归法求两个数的最大公约数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!