其他分享
首页 > 其他分享> > 10. 最大公约数&最小公倍数&加法原理&乘法原理&排列组合

10. 最大公约数&最小公倍数&加法原理&乘法原理&排列组合

作者:互联网

目录

10. 最大公约数&最小公倍数&加法原理&乘法原理&排列组合

约数&倍数

约数:又称因子,当 a/b=q...r(r=0)时,称 b 为 a 的约数/因子。

公约数:两个数的公共约数,如
12 的约数有:1 2 3 4 6 12
24 的约数有:1 2 3 4 6 8 12 24

则 12 与 24 的公约数有:1 2 3 4 6 12。
其中 12 是最大的,我们就称 12 为两者的最大公约数。

倍数:当 a/b=q...r(r=0)时,称 a 为 b 的倍数,记做: b|a。

公倍数:两个数的公共倍数,如
12 的倍数有:12 24 36 48 ...
24 的倍数有:24 48 72 96 ...

显而易见,12 与24 的倍数都是无限的,且具有无限的公倍数:24 48 ...
其中 24 是最小的,我们就称 24 为两者的最小公倍数。

那么如果让你来分析 任意两个数的最大公约数与最小公倍数,有信心嘛!

【题目描述】输入 a,b, 求他们的最大公约数与最小公倍数。
【输入样例】12 20
【输出样例】4 60

先自己思考吧!

求最大公约数的三种方法:

  1. 最小递减法
    先找 a,b 的最小值,判断该值能否同时被 a,b 整除,如果可以该数就是答案,否则每次-1,继续判断,直到找到答案。

  2. 更相减损法
    a-b=c,则 a,b 的最大公约数就是 b,c 的最大公约数,如果 c=0,a 就是答案。

  3. 辗转相除法
    a/b=q...r,则 a,b 的最大公约数就是 b,r 的最大公约数,如果 r=0,则 b 就是答案。

辗转相除法&更相减损法的证明,点击跳转

求最小公倍数的两种方法:

  1. 最大递增法
    先找 a,b 的最大值,判断该值能否同时整除 a,b,如果可以该数就是答案,否则每次+1,继续判断,直到找到答案。

  2. 定理法:两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。

//最小递减法求最大公约数
int gcd1(int a, int b){
    for(int i=min(a,b); i>=1; i--){
        if(a%i==0 && b%i==0) return i;
    }
    return 1;
}
//更相减损法求最大公约数
int gcd2(int a, int b){
    if(a<b) swap(a, b);
    if(b==0) return a;
    return gcd2(b,a-b);
}
//辗转相除法求最大公约数
int gcd3(int a, int b){
    if(b==0) return a;
    return gcd3(b, a%b);
}

//最大递增法求最小公倍数
int lcm1(int a, int b){
    for(int i=max(a,b); ; i++){
        if(i%a==0 && i%b==0) return i;
    }
}
//定理法:两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积
int lcm2(int a, int b){
    return a*b/gcd3(a,b);
}

int main(){
    int a,b; scanf("%d%d", &a, &b);

    printf("gcd1(%d,%d) = %d\n", a, b, gcd1(a,b));
    printf("gcd2(%d,%d) = %d\n", a, b, gcd2(a,b));
    printf("gcd3(%d,%d) = %d\n", a, b, gcd3(a,b));
    printf("lcm1(%d,%d) = %d\n", a, b, lcm1(a,b));
    printf("lcm2(%d,%d) = %d\n", a, b, lcm2(a,b));
    return 0;
}

输入:12 20
输出:
gcd1(12,20) = 4
gcd2(12,20) = 4
gcd3(12,20) = 4
lcm1(12,20) = 60
lcm2(12,20) = 60

标签:24,10,12,公倍数,约数,int,最大公约数,原理
来源: https://www.cnblogs.com/hellohebin/p/16329507.html