最大公约数和最小公倍数基本模板(gcd和lcm)

首先是最大公约数,这有2种写法,一个是省事一点地递归写法:

#include <iostream>
#include <cstdio>
using namespace std;

int gcd(int a, int b)
{
    return a%b==0 ? b:gcd(b, a%b);
}

int main()
{
    int a, b;
    while(true)
    {
        scanf("%d%d", &a, &b);
        printf("%d\n", gcd(a, b));
    }
}

原理其实很简单,就是模拟辗转相除法
首先算法若a < b, 算法会转换一下a 和 b,

然后对他们取余数, 并用较小的数再次求余,直到余数为0, 最小的数就是最大公约数!

数学也可以用来推倒:

nx % x == 0 时 x 为最大公约数。

下面是这个思路的速度较快的算法:

#include <iostream>
#include <cstdio>
using namespace std;

int gcd(int a, int b)
{
    if(b == 0)
        return a;
    else
        return gcd(b, a%b);
}

int main()
{
    int a, b;
    while(true)
    {
        scanf("%d%d", &a, &b);
        printf("%d\n", gcd(a, b));
    }
}

这个因为没有递归,所以速度快些,大数的时候可以改long long 用这个!

下面是延伸一下就可以得到最小公倍数(lcm)模板了:

由于a*b除以他们的最大公约数就是最小公倍数。

故而有:

#include <iostream>
#include <cstdio>
using namespace std;

int gcd(int a, int b)
{
    if(b == 0)
        return a;
    else
        return gcd(b, a%b);
}

int lcm(int a, int b)
{
    return a/gcd(a, b)*b; //注意这里的顺序, a*b再除以最小公倍数!这样错误率低!亲测!
}

int main()
{
    int a, b;
    while(true)
    {
        scanf("%d%d", &a, &b);
        printf("%d %d\n", gcd(a, b), lcm(a, b));
    }
}

如有疑问,欢迎评论指出!

posted @ 2019-01-19 17:41  mpeter  阅读(427)  评论(0编辑  收藏  举报