其他分享
首页 > 其他分享> > 2020-11-11递归的辗转相除法

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