求解最大公约数以及最小公倍数
最大公约数和最小公倍数求解,常用的方法是短除法进行因式分解,然后最大公约数是所有公共因子的乘积,最小公倍数是所有因子的乘积。
本质上求最小公倍数就是求最大公倍数:x=m*a
, y=m*b
;m是最大公约数,那最小公倍数就是m*a*b
。所以可以得到最大公约数与最小公倍数的关系:
LCM(A,B) × GCD(A,B)=A × B
其中LCM是最小公倍数,GCD是最大公约数
来源:https://blog.csdn.net/Holmofy/article/details/76401074
作者总结出来的结论非常的有用,我们后续就根据这个思路去写算法。
辗转相除法(欧几里得算法)求最大公约数
辗转相除法:辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,除数去除出现的余数(第一余数),再用第一余数去除出现的余数(第二余数),如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
来源:https://baike.baidu.com/item/辗转相除法/4625352?fr=aladdin
注:百度百科里面的描述好像不对。大家可以比较下
具体算法如下:
int max_gcd(int a,int b){if (a <= 0 || b <= 0) {printf("please > 0\n");return -1;}if (a<b) {int tmp = a;a= b;b = tmp;}int r;while (a%b > 0) {r = a%b;a = b;b = r;}return b;
}
辗转相除法的时间复杂度:我们已知斐波纳契数列增长速度是指数,那么待分析的数列也是指数增长.设欧几里得算法需要k次,那么j=O(2^k),则k=O(lg j).
结合文章开头对于公约数的概念,我这边还有另外的一种方案去实现,具体代码如下:
int max_gcd1(int a,int b){if (a <= 0 || b <= 0) {printf("please > 0\n");return -1;}if (a<b) {int tmp = a;a= b;b = tmp;}int max = 1;for (int i = 1; i<=b; i++) {if (b%i == 0 && a%i == 0) {int tmpMax = max * i;if (tmpMax <= b) {if (b%tmpMax == 0 && a%tmpMax == 0){max = tmpMax;i = tmpMax;}else{max = i;}}else{max = i;}}}return max;
}
大家可以清晰的感觉到无论是从运算的速度,以及逻辑的清晰度来说,辗转相除法都有非常大的优势。
在网上搜了一下,发现我国古代数学家提出了一个更相减损法的算法去求最大公约数。描述如下:
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
根据描述,我这边实现如下:
int max_gcd2(int a,int b){int c = 1;while (a%2 == 0 && b%2 == 0) {c *= 2;a = a/2;b = b/2;}while (a != b) {if (a > b) {a = a - b;}else{b = b - a;}}return a * c;}
两种算法的区别
(1)两者都是求最大公因数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显。
(2)从结果体现形式来看,辗转相除法体现结果是以相除余数为0则得到,而更相减损术则以减数与差相等而得到。
转载地址:https://blog.csdn.net/Holmofy/article/details/76401074
更多优质文章,可以微信扫码关注:
求解最大公约数以及最小公倍数相关推荐
- 辗转相除法(欧几里得算法)求解最大公约数、最小公倍数
辗转相除法(欧几里得算法)求解最大公约数.最小公倍数 通常来说,求解两个数的最大公约数和最小公倍数是常见的算法问题,我们正常人最先想到的肯定是穷举法,通过while循环或者for循环,不断改变循环数, ...
- c语言 最大公约数 最小公倍数的编程,C语言三种算法求解最大公约数与最小公倍数...
C语言三种算法求解最大公约数与最小公倍数 最大公约数与最小公倍数的求解是很多初学C的人所面临的一道问题.当然这道问题并不难解答,也有很多人已经写过相关的博客,我在此书写此篇博客,一是为了让自己能够夯实 ...
- 多种方法求解“最大公约数”和“最小公倍数”
目录 一.最大公约数 1.枚举法 2.辗转相除法 二.最小公倍数 1.枚举法 2.扩大法 Hello,大家好,我是灰小猿,一个超会写bug的程序猿. 今天在这里记录一下在程序中求解两个数的最大公约数和 ...
- 三种算法求解最大公约数和最小公倍数
1.穷举法 穷举法的基本思想是:根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕.若某个情况验证符合题目的全部条件,则为本问题的一个解:若全部情况验证后 ...
- C++实现求解最大公约数和最小公倍数
参考:http://baike.baidu.com/view/47637.htm?fr=aladdin 两种方法比较: (1)都是求最大公因数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主, ...
- 五十九、如何求N个数的最大公约数和最小公倍数
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 上次介绍了短除法的因式分解,下面正式进入求解:两个及以上个数的最大公 ...
- 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数
第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...
- python求两个数的最大公约数穷举法_五十九、如何求N个数的最大公约数和最小公倍数...
「@Author:Runsen」 ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」 ❞ 上次介绍了短除法的因式分解,下面正式进入求解:「两个及 ...
- 求两数最大公约数和最小公倍数(详解)
求两数最大公约数和最小公倍数 方法一:单独求解最小公倍数 若大数m是小数n的倍数,则大数m为所求的最小公倍数:若不是,另寻找一个能同时被两个整数的自然数.找到第一个后,break终止循环. 终止条件: ...
最新文章
- index 0 does not match the shape of the indexed tensor [8, 8, 4] at index 0
- dpkg: 处理软件包 update-notifier-common (--configure)时出错:
- php 调用 perl,perl中如何调用R语言
- php源码编程,10个小技巧让你做好php源码编程
- 贴花纸怎么贴_陶瓷贴花纸DIY怎么做?
- 1.5编程基础之循环控制 26 统计满足条件的4位数个数 python
- linux命令编写,Linux alias命令编写
- 如何在geth中创建genesis.json_Adobe XD 入门教程-如何在 Adobe XD 中创建交互式原型?...
- 软件设计师考试笔记:UML统一建模语言
- 法拉利等12家车厂 将与苹果手机联网(图)
- socket error:10053
- Android的一个登陆注册页面
- solr配置索引库启动tomcat报错记录及解决
- mysql语句高逼格_求一些逼格高的语句?
- matlab中如何取正数,excel表格数据取正值-怎么把excel表格的负数变成正数
- 互联网产品经理的职责
- 风控决策引擎——决策流路径规划
- 全国各地电台FM.ini汇总
- 华为正式上线鸿蒙,华为Mate30、鸿蒙OS资料汇总,方舟编译器正式上线
- Android OTA releasekey 替换