最大公约数,最小公倍数,欧几里得算法(辗转相除法,gcd)

已知x y,求最大公约数z:
6 2  --> 最大公约数:2
15 10  --> 最大公约数:5

解释:几何解释,视频解释的相当好。
https://www.bilibili.com/video/av77974575

if x % y == 0   y就是最大公约数

 

证明:
x、y存在最大公约数z
那么 x能整除z 、 y也能整除z  【如 6%2 == 0   2%2 == 0】、【15 % 5 == 0   10 % 5 ==0】
所以 x y 的线性组合 也能整除z   【系数AB :   (Ax + By) % z == 0】
辗转相除法(x > y):
x / y == k ... c
-->  x == ky + c
-->  x - ky  == c
-->  Ax - By(特例 x - ky)能整除z  那么c也能整除z

通过这个思路 开始套娃,减小范围,把d(x,y) == d(小数y,余数c) 直到 if x % y == 0   y就是最大公约数

-------

求104,40的最大公约数

d(104,40) = d(40,24) = d(24,16) = d(16,8) = 8
 

# include <iostream>
using namespace std;


int gcd(int a, int b) {

// 要求a大  b小
    if (a < b) {
        swap(a, b);
    }

    if (a % b == 0) {
        return b;
    }


    int r = a % b;
    return gcd(b,r);


}

int main() {


    int res = gcd(104,40);
    cout << res << endl;



}
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <stack>
using namespace std;


//GreatestCommonDivisor
int gcd(int x, int y) {
    //y要求x大 y小
    if(x < y) {
        swap(x, y);
    }

    if (x % y == 0) {
        return y;
    } else {
        int yu = x % y;
        return gcd(y, yu);
    }

}





int main() {
    int x, y;
    cin >> x >> y;
    cout << gcd(x, y) << endl;;
    cout << x * y / gcd(x,y) <<endl;


}

 最小公倍数=两数乘积/最小公约数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值