已知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;
}
最小公倍数=两数乘积/最小公约数