递归法求两个数的最大公约数。 函数接口定义: 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
时间: 2023-08-21 09:09:12 浏览: 343
可以使用辗转相除法进行递归求解最大公约数。
具体步骤如下:
1. 若 m < n,则交换 m 和 n。
2. 若 n 等于 0,则返回 m。
3. 否则,将 m 除以 n,得到余数 r,然后递归调用 gys(n, r)。
代码实现如下:
```c
#include <stdio.h>
int gys(int m, int n) {
if (m < n) { // 保证 m >= n
int temp = m;
m = n;
n = temp;
}
if (n == 0) { // 边界条件
return m;
} else { // 递归求解
return gys(n, m % n);
}
}
int main() {
int m, n;
scanf("%d%d", &m, &n);
printf("%d\n", gys(m, n));
return 0;
}
```
输入样例:
```
24 16
```
输出样例:
```
8
```
相关问题
用递归法求数组的最大值.函数接口定义:int amax
(int *arr, int n),其中arr为整型数组,n为数组长度。下面是递归实现的代码:
```c++
int amax(int *arr, int n) {
if (n == 1) {
return arr[0];
}
int max = amax(arr, n - 1);
if (max > arr[n - 1]) {
return max;
} else {
return arr[n - 1];
}
}
```
首先,当数组长度为1时,直接返回数组中唯一的元素。
否则,先递归求出前n-1个元素的最大值,然后将这个最大值与第n个元素进行比较,返回更大的那个。
注意,这里用到了三目运算符,可以简化代码。
利用递归求两个数的最大公约数(利用辗转相除法) f(m,n)
好的,我来给您讲解一下如何利用递归求两个数的最大公约数。
辗转相除法,又称欧几里得算法,是求两个正整数的最大公约数的一种方法。它的具体步骤是:用较大的数除以较小的数,再用除数除以出现的余数(第一余数),再用第一余数除以出现的余数(第二余数),如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
利用递归实现辗转相除法,可以采用以下思路:
1. 如果 m%n==0,那么n就是最大公约数;
2. 否则,最大公约数等于n和m%n的最大公约数。
根据以上思路,我们可以写出如下的递归函数:
```
int gcd(int m, int n) {
if (n == 0) {
return m;
} else {
return gcd(n, m % n);
}
}
```
以上函数即为利用递归求两个数的最大公约数的代码实现,其中m和n分别表示两个需要求最大公约数的正整数。
阅读全文