如何用C++求两个数的最大公约数和最小公倍数
原理
最大公约数
有两个数字n和m。现在要求两个数字的最大公约数。
例如:n为18,m为4.
正常我们的思路求解最大公约数是暴力破解,遍历一遍公约数,取最大的那个,但是这样有一个问题,就是时间复杂度过高了。
有没有什么优化的方法呢?
我们可以先把18变成18-4=14,然后求和4的最大公约数;以此往复。但是每次都需要递减,碰到1000001和200这样的数字时,时间复杂度还是很高。
所以我们需要有最优化的方法
我们可以把数字递减理解为除以数字很多次,那么就变成了18对4取余,此时变为2和4;然后我们把4对2取余,此时变为2和0;那么最终结果就为2.
最小公倍数
通过观察18和4两个数字,发现18 = 2 * 9; 4 = 2 * 2;9和2都是质数,而2则是共同的最大公约数。
我们假设有两个数字n和m。
n = k * a -- 1式 m = k * b -- 2式 那么gcd(n,m)=k.
所以我们把1式和2式相乘,左边=n * m,右边=k * k * a * b。
就得到n * m = gcd(n, m) * k * a * b
此时的a * b * k 正好式n和m的最小公倍数,所以就得到
n * m = gcd(n, m) * lcm(n, m)
代码
#include <iostream>
using namespace std;
//定义gcd求最大公约数的函数
int gcd(int num1, int num2) {
if (num1 == num2) {
return num1;
}
else if (num1 < num2) {
return num1 == 0 ? num2 : gcd(num1, num2 % num1);
}
else {
return gcd(num2, num1);
}
}
// 定义最小公倍数的函数
int lcm(int num1, int num2) {
return num1 / gcd(num1, num2) * num2;
}
int main() {
int n, m;
cout << "输入两个数字n和m:\n";
cin >> n >> m;
printf("%d和%d的最大公约数为%d \n", n, m, gcd(n, m));
printf("%d和%d的最小公倍数为%d", n, m, lcm(n, m));
return 0;
}
运行结果

补充:性质
1.最小公倍数是最大公因数的倍数(最小公倍数 / 最大公因数 = 一个整数)
2.a与b的和差是最大公因数的倍数
3.最大公因数一定小于或等于min(a,b)
4.最小公倍数一定大于或等于max(a,b)
5.a*b = 最小公倍数*最大公因数
6.如果a, b两个数是互质数,最大公因数等于1,最小公倍数等于a*b
总结
到此这篇关于如何用C++求两个数的最大公约数和最小公倍数的文章就介绍到这了,更多相关C++求最大公约数和最小公倍数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
C++如何比较两个字符串或string是否相等strcmp()和compare()
这篇文章主要介绍了C++如何比较两个字符串或string是否相等strcmp()和compare()问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-11-11
c++中#include <>与#include""的区别详细解析
<>先去系统目录中找头文件,如果没有在到当前目录下找。所以像标准的头文件 stdio.h、stdlib.h等用这个方法2013-10-10
C++ LeetCode1945题解字符串转化后的各位数字之和
这篇文章主要为大家介绍了C++ LeetCode1945题解字符串转化后的各位数字之和示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12


最新评论