2020-11-11递归的辗转相除法
作者:互联网
Description
辗转相除法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。根据这个原理,不难得出用辗转相除法求最大公约数的递归定义:
下面,给出两个正整数A和B,求他们的最大公约数(gcd(A,B))和最小公倍数(lcm(A,B))。
-----------------------------------------------------------------------------
Invalid Word(禁用单词)错误:在解决这个题目时,某些关键词是不允许被使用的。如果提交的程序中包含了下列的关键词之一,就会产生这个错误。
被禁用的关键字:循环语句for、while,甚至包括分支语句的switch、case、goto、break。
被禁用的头文件:math.h、stdlib.h。
Input
输入为两个整数A和B,满足0<A,B<2^15。
Output
输出两数,分别为gcd(A,B)和lcm(A,B),用一个空格分隔。
My Answer
#include<stdio.h>
#include<stdio.h>
int zdg(int m,int n)
{
int x,y;
if(m%n!=0)
{
x=m-n*(m/n);
m=n;
n=x;
y=zdg(m,n);
return y;
}
if(m%n==0)
return n;
}
int zxg(int a,int b,int m)
{
int x,y,z;
x=a/m;
y=b/m;
z=x*y*m;
return z;
}
int main()
{
int a,b,m,n,x,y;
scanf("%d%d",&a,&b);
if(a>b)
{
m=a;
n=b;
}
if(a==b)
printf("%d %d",a,b);
if(a<b)
{
m=b;
n=a;
}
if((a!=0)&&(b!=0))
{
x=zdg(m,n);
y=zxg(m,n,x);
printf("%d %d\n",x,y);
}
else if(a==0)
printf("%d %d\n",b,a);
else if(b==0)
printf("%d %d\n",a,b);
}
求最大公约数的思路就是题目中的函数的那张图片所描述的那样,基本不用多说,我想说的,其实主要还是递归函数这个东西,初次实验的时候,因为太紧张,导致返回值搞错了,一直没有做出来,这就要注意最后一次的返回值与其他情况的返回值的区别,而且在做递归函数的题时要判断清楚函数是否需要返回值,否则设定的返回值便没有意义或者需要返回值的时候却没有返回值,以至于某些变量没有被赋值。推荐判断函数需要返回值时用void 与 int将其区分开来。
标签:11,return,int,辗转,最大公约数,2020,返回值,除法 来源: https://blog.csdn.net/qq_50569949/article/details/109726559