C++最大公约数(gcd)和最小公倍数(lcm)

最大公约数和最小公倍数详解

一、最大公约数(GCD)

1. 什么是最大公约数?

最大公约数(Greatest Common Divisor),简称GCD,是指两个或多个整数共有约数中最大的一个。

例子:求15和12的最大公约数

  • 15的约数:1, 3, 5, 15
  • 12的约数:1, 2, 3, 4, 6, 12
  • 公共约数:1, 3
  • 最大公约数:3

2. 计算方法

方法一:枚举法

从较小的数开始向下枚举,找到的第一个公约数就是最大公约数。

#include<iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    for(int i = min(a,b); i >= 1; i--) {
        if(a % i == 0 && b % i == 0) {
            cout << i;
            break;
        }
    }
    return 0;
}
方法二:辗转相除法(欧几里得算法)

更高效的算法,基于以下原理:

  • 用较大数除以较小数,得到余数
  • 用较小数除以余数,重复这个过程
  • 直到余数为0,最后的除数就是GCD
#include<iostream>
using namespace std;

int main() {
    int a, b, r;
    cin >> a >> b;
    while(a % b != 0) {
        r = a % b;
        a = b;
        b = r;
    }
    cout << b;
    return 0;
}

二、最小公倍数(LCM)

1. 什么是最小公倍数?

最小公倍数(Least Common Multiple),简称LCM,是指两个或多个整数公有的倍数中最小的一个。

2. 计算方法

方法一:枚举法

从较大的数开始向上枚举,找到的第一个公倍数就是LCM。

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

int main() {
    int a, b;
    cin >> a >> b;
    for(int i = max(a,b); i <= a*b; i++) {
        if(i % a == 0 && i % b == 0) {
            cout << i;
            break;
        }
    }  
    return 0;
}
方法二:公式法

利用GCD和LCM的关系:LCM(a,b) = (a × b) / GCD(a,b)

#include<iostream>
using namespace std;

int gcd(int a, int b) {
    while(a % b != 0) {
        int r = a % b;
        a = b;
        b = r;
    }
    return b;
}

int main() {
    int a, b;
    cin >> a >> b;
    cout << a * b / gcd(a, b);
    return 0;
}

三、知识脉络图

四、典型题目解析

题目1:求自然数的因数

#include <iostream>
using namespace std;

int main() {
    int n, cnt = 0;
    cin >> n;
    for(int i = 1; i < n; i++) {
        if(n % i == 0) {
            cout << i << ",";
            cnt++;
        }
    }
    cout << n << endl << "total=" << cnt + 1;
    return 0;
}

题目2:最大公约数

#include<iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    for(int i = min(a,b); i >= 1; i--) {
        if(a % i == 0 && b % i == 0) {
            cout << i;
            break;
        }
    }
    return 0;
}

题目3:辗转相除法过程演示

#include<iostream>
using namespace std;

int n, m;

int main() {
    cin >> n >> m;
    cout << n << ' ' << m << endl;
    while(n % m) {
        int t = n % m;
        n = m;
        m = t;
        cout << n << ' ' << m << endl;
    }
    cout << m << ' ' << 0 << endl;
    return 0;
}

题目4:求最小公倍数

#include<iostream>
using namespace std;

int main() {
    long long a, b, m, n, r;
    cin >> a >> b;
    m = a;
    n = b;
    while(m % n != 0) {
        r = m % n;
        m = n;
        n = r;
    }
    cout << a * b / n;
    return 0;
}

五、总结

  1. 最大公约数:两个数共有的最大约数
    • 计算方法:枚举法、辗转相除法
  2. 最小公倍数:两个数共有的最小倍数
    • 计算方法:枚举法、公式法(利用GCD)
  3. 关系:LCM(a,b) × GCD(a,b) = a × b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值