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!\n");
    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\n",a);
    printf("The minum common multiple is %d\n",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!\n");
    scanf("%u%u",&m,&n);
    printf("The gcd of %u and %u is %u.\n",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);
}



posted @ 2014-03-03 10:32  庄浩  阅读(1022)  评论(0编辑  收藏  举报