ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-31 10:32:55  阅读:191  来源: 互联网

标签:24 10 12 公倍数 约数 int 最大公约数 原理


目录

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有