1. 程式人生 > >多個最小公倍數/最大公約數(最高效演算法模板)

多個最小公倍數/最大公約數(最高效演算法模板)

最小公倍數和最大公約數

           兩數最小公倍數

   輾轉相除法求最大公約數,使a>b,a,b不斷取餘數直到a,b相等

int gcd(int a, int b)
{
    if(a < b) a = a^b, b = b^a, a = a^b;
    int c = a%b;
    while(a%b != 0){
        a = b, b = c, c = a % b;
    }
    return b;
}

兩數最大公約數

a*b/gcd(a,b)

多個數最小公倍數

但注意一定要大於兩個數才可以,從第二個數開始,依次和第一個數取gcd(沒錯就是這麼簡單)

int gcd(int a, int b)
{
    if(a < b) a = a^b, b = b^a, a = a^b;
    int c = a%b;
    while(a%b != 0){
        a = b, b = c, c = a % b;
    }
    return b;
}

int main()
{
    int num[20], n;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
        scanf("%d",&num[i]);
    int ans = num[1];
    for(int i = 2; i <= n; i++)
        ans = gcd(ans, ans);
    printf("%d",ans);
    return 0;

多個數最大公約數

 也很簡單,從第二個數開始依次和第一個數取lcm;

int gcd(int a, int b)
{
    if(a < b) a = a^b, b = b^a, a = a^b;
    int c = a%b;
    while(a%b != 0){
        a = b, b = c, c = a % b;
    }
    return b;
}

int main()
{
    int num[20], n;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
        scanf("%d",&num[i]);
    int ans = num[1];
    for(int i = 2; i <= n; i++)
        ans = ans*num[i]/gcd(ans, num[i]);
    printf("%d",ans);
    return 0;
}