zoukankan      html  css  js  c++  java
  • C语言经典算法100例-016-求最大公约数和最小公倍数

    题目如下:

    输入两个正整数m 和n,求其最大公约数和最小公倍数。

    1.分析:利用辗转相除法计算最大公约数,再求最小公倍数。下面是辗转相除法的理论:


    辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 / 105 = 2余42,所以105和42的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至余数变为零。这时的除数就是所求的两个数的最大公约数。


    2.实现:首先我们来看一种非递归的方式:

    #include <stdio.h>
    #include <stdlib.h>
    //求最大公约数和最小公倍数
    int main()
    {
        int num1,num2,temp;
        int a,b;
        printf("Plese input two integers!
    ");
        scanf("%d%d",&num1,&num2);
        if(num1<num2)   //使num1保存较大值
        {
            temp=num1;
            num1=num2;
            num2=temp;
        }
        a=num1;
        b=num2;
        while(b!=0)     //辗除法 直到b=0
        {
            temp=a%b;
            a=b;
            b=temp;
        }
        printf("The max common divisor is %d
    ",a);
        printf("The minum common multiple is %d
    ",num1*num2/a);
        return 0;
    }
    其实,使用递归更直观更容易理解。

    #include <stdio.h>
    #include <stdlib.h>
    //使用递归法求最大公约数
    unsigned gcd(unsigned,unsigned);
    int main()
    {
        unsigned m,n;
        printf("Please input two integers!
    ");
        scanf("%u%u",&m,&n);
        printf("The gcd of %u and %u is %u.
    ",m,n,gcd(m,n));
        return 0;
    }
    unsigned gcd(unsigned m,unsigned n)
    {
        unsigned temp;
        //交换m,n使n保存较大值
        if(m<n)
        {
            temp=m;
            m=n;
            n=temp;
        }
        //可以整除则返回除数,否则改变m,n继续求
        if(m%n==0) return n;
        else return gcd(n,m%n);
    }



  • 相关阅读:
    Gram 矩阵性质及应用
    Gram 矩阵性质及应用
    经典公开课、好的学习网站
    经典公开课、好的学习网站
    机器学习、深度学习经典课程
    机器学习、深度学习经典课程
    机器学习竞赛(代码)
    机器学习竞赛(代码)
    数学类网站、代码(Matlab & Python & R)
    数学类网站、代码(Matlab & Python & R)
  • 原文地址:https://www.cnblogs.com/mrbourne/p/9959508.html
Copyright © 2011-2022 走看看