1. 程式人生 > >SDUST OJ輾轉相除法求最大公約數與最小公倍數

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  !   !   !