SDUST OJ辗转相除法求最大公约数与最小公倍数

题目在介绍里面已经透露了很大一部分信息,所以只要动一丢丢脑筋就可以啦,让我们来看一下代码吧:

#include <stdio.h>
int gcd(int a,int b)
{
    return b? gcd(b,a%b) : a;
}
int lcm(int a,int b)
{
    int m,n,c;
    m=a*b;
    n=m/gcd(a,b);
    return n;
}
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)==2)
    printf("%d %d\n",gcd(a,b),lcm(a,b));
    return 0;
}

代码看上去十分的简洁,因为只要遵循题意来就好了呀,这里运用了三目运算符,可以减少不少的代码量;

让我们再来看一下VJ上杭电的水题。既然说了这是水题的话那就说明这个题目本身是不怎么难的。

但是初步看上去要求n个数的最小公倍数,一个一个记录下来求的话好像是有点麻烦,那么有没有好的方法呢???

当然是有的呀,不然我也不会说哈哈哈哈~~~~~~

先看代码吧:

unsigned long lcm(unsigned long a,unsigned long b)
{
    unsigned long m,n,c;
    m=a,n=b;
    c=a%b;
    while(c!=0)
    {
        a=b;
        b=c;
        c=a%b;
    }
    return m*n/b;
}
int main()
{
    int n,i;
    unsigned long t;
    while(scanf("%d",&n)!=EOF)
    {//必须用unsigned long型,最后可能为32位的整数
        unsigned long x=1;
        for(i=1;i<=n;i++)
        {
            scanf("%ld",&t);
            x=lcm(x,t);
        }
        printf("%d\n",x);
    }
    return 0;
}

这里我没有写一个求最大公因数的函数gcd,为的就是让大家能看懂gcd的来源;

在一开始我设立了一个x=1,因为1与任何数的最大公倍数都是它本身,所以,1的设立尤为重要,x=lcm(x,t)是整个代码的核心,他实现了得到多个数的最小公倍数。

这里的数据类型我设置的是unsigned long型,其实再开大一点也没有关系,但如果开小了的话就会数据溢出。

谢谢大家的关注,我会持续更博的。  T  H   A  N  K  Y  O  U   F  O  R  W  A  T  C  H  !   !   ! 

猜你喜欢

转载自blog.csdn.net/weixin_43820496/article/details/85057115
今日推荐