您的位置:首页 > 编程语言 > C语言/C++

C语言进阶-第6讲:递归法问题求解(两数的最大公约数)

2017-11-06 16:56 281 查看
任务和代码:

/*
*All rights reserved
*文件名称:main.c
*作者: Osseyda
*完成日期:2017.11.6
*版本号:v2.
*
*问题描述:两数最大公约数的递归版(辗转相除法)
*递归思路:
有两整数a和b(a>b):
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行 ①
例如,求27和15的最大公约数的过程为:
27%15=12 15%12=3 12%3=0
3即为最大公约数
*/
#include <stdio.h>
int main(){
int a,b,g;
scanf("%d %d",&a,&b);
g=mygcd(a,b);
printf("最大公约数是:%d\n", g);
return 0;
}
int mygcd(int m,int n){
if(m < n){
int temp = m;
m = n;
n = temp; //n是较小的数
}
if(n == 0)
return m; //基准条件
return mygcd(n, m%n);
}
/*
*All rights reserved
*文件名称:main.c
*作者: Osseyda
完成日期:2017.11.6
*版本号:v2.
*
*问题描述:两数最大公约数的递归版(相减法)
*递归思路:
有两整数a和b:
① 若a>b,则a=a-b
② 若a<b,则b=b-a
③ 若a=b,则a(或b)即为两数的最大公约数
④ 若a≠b,则再回去执行①
例如,求27和15的最大公约数的过程为:
27-15=12(15>12) 15-12=3(12>3)
12-3=9(9>3)     9-3=6(6>3)
6-3=3(3==3)
因此,最大公约数是3
*/
#include <stdio.h>
int main(){
int a,b,g;
scanf("%d %d",&a,&b);
g=mygcd(a,b);
printf("最大公约数是:%d\n", g);
return 0;
}
int mygcd(int m,int n){
if(m==n)
return m;
else{
if(m>n)
return mygcd(m-n,n);
else
return mygcd(m,n-m);
}
}


知识点总结:

         分别用了辗转相除法和相减法用递归实现了求两数的最大公约数

         没有像上一篇中可以直接列写递归方程,但可以写出递归思路

         根据递归思路,先编写递归结束条件,再具体实现在函数里调用自身的代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 递归