如何用C++求两个数的最大公约数和最小公倍数

 更新时间:2023年01月05日 09:13:04   作者:Kinght_123  
最大公约数是指两个或多个整数共有约数中,最大的一个约数,常用的方法是欧几里得算法,也叫辗转相除法,下面这篇文章主要给大家介绍了关于如何用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语言类型转换与常量的细节深入理解探究

    C语言类型转换与常量的细节深入理解探究

    这篇文章主要为大家介绍了C 语言类型转换与常量的细节深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • C++的多态和虚函数你真的了解吗

    C++的多态和虚函数你真的了解吗

    这篇文章主要为大家详细介绍了C++的多态和虚函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++详细讲解模拟实现位图和布隆过滤器的方法

    C++详细讲解模拟实现位图和布隆过滤器的方法

    位图(bitset)是一种常用的数据结构,常用在给一个很大范围的数,判断其中的一个数是不是在其中。在索引、数据压缩方面有很大的应用。布隆过滤器是由布隆提出的,它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中
    2022-06-06
  • 详解C语言中strcpy函数与memcpy函数的区别与实现

    详解C语言中strcpy函数与memcpy函数的区别与实现

    这篇文章主要介绍了C语言中字符串拷贝函数(strcpy)与内存拷贝函数(memcpy)的不同及内存拷贝函数的模拟实现,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-12-12
  • Linux中rm命令使用以及C/C++代码实现

    Linux中rm命令使用以及C/C++代码实现

    m 是remove 的缩写,Linux中 rm 命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除,这篇文章主要给大家介绍了关于Linux中rm命令使用以及C/C++代码实现的相关资料,需要的朋友可以参考下
    2022-04-04
  • 用C语言实现三子棋游戏

    用C语言实现三子棋游戏

    这篇文章主要为大家详细介绍了用C语言实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Qt使用windeployqt工具实现程序打包发布方法

    Qt使用windeployqt工具实现程序打包发布方法

    本文主要介绍了Qt使用windeployqt工具实现程序打包发布方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言的fork函数在Linux中的进程操作及相关面试题讲解

    C语言的fork函数在Linux中的进程操作及相关面试题讲解

    fork函数只能在类Unix的系统中使用,用于创建子线程,这里总结了C语言的fork函数在Linux中的进程操作及相关面试题讲解,先来看一下C语言程序的存储空间与进程示意:
    2016-06-06
  • 简述C语言中system()函数与vfork()函数的使用方法

    简述C语言中system()函数与vfork()函数的使用方法

    这篇文章主要介绍了简述C语言中system()函数与vfork()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C++二分查找在搜索引擎多文档求交的应用分析

    C++二分查找在搜索引擎多文档求交的应用分析

    这篇文章主要介绍了C++二分查找在搜索引擎多文档求交的应用,实例分析了二分查找的原理与C++的实现及应用技巧,需要的朋友可以参考下
    2015-06-06

最新评论