多个最小公倍数/最大公约数(最高效算法模板)

最小公倍数和最大公约数

      两数求最大公约数

                   辗转相除法求最大公约数,使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, num[i]);
    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;
}

 

你可能感兴趣的:(算法总结)