关于求最大公倍数的不同算法比较

如果想要求两个正整数a和b的最大公倍数,我们可以想到多种求解的方法,下面给出两种比较常见的算法实现:
第一种,直接循环求解:
其求解思路很简单,先让最大公倍数等于a和b中较大的那一个,因为最大公倍数最小也是这样的数。然后将最大公倍数lcm++循环,如果lcm增大到某一个可以同时将a和b都分别整除时,这样遇见的第一个lcm的值就是其最大公倍数,并返回其值。这一算法的最坏时间复杂度为NM

int lcm(int a, int b)
{int lcm=a>b ? a : b;for(lcm;lcm<=a*b;lcm++){if(lcm%a==0&&lcm%b==0)return lcm;}
}

第二种,通过求最大公约数递归求解:
这种思路的巧妙之处在于,使用了转化的思想将最小公倍数的求解转化为了最大公约数的求解,即两数的最小公倍数实际上等于a和b的乘积再除去两者的最大公约数。
而最大公约数的求解又使用了递归的巧妙解法,即对于数a和b,若他们存在最大公约数x,那么a可以表示为nx,b可以表示为mx,那么最大公约数的求解就是要求x,首先要保证a始终比b大的情形,如果b>a,那么我们通过进一步求取gcd(b,a%b)实际上就将原函数转化为了gcd(b,a)保证了第一个参数始终较大,我们可以用其中的较大者去对较小者取余,其结果就是nx-kmx=dx,其中k为商,dx为取余后的结果,当然,如果n=km,k为整数的情况,dx直接为0,此时说明我们已经求得了最大公约数,即为a,b中的较小者,所以我们返回b的值作为最大公约数,如果dx不等于0,那么dx一定是nx比mx多的部分,我们为了求得x的值,进一步对mx和dx进行重复运算直到最坏情况d等于1时,我们求得x的值,或者途中m是d的整数倍,那么此时的最小公倍数就是较小者。
这一算法的时间复杂度只是一个很小的常数,而不是规模N,M的线性关系,大大减小了算法的时间复杂度,这在大规模求解最小公倍数时可以为程序减少大量的时间。

int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
int lcm(int a, int b) { return a  * b/ gcd(a, b); }

关于求最大公倍数的不同算法比较相关推荐

  1. c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法

    C 语言求最大公约数和最小公倍数算法 C 语言求最大公约数和最小公倍数可以说是C 语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容.其算法方面除常用的辗转相除法外.还 ...

  2. C语言求最大公约数GCD的算法(附完整源码)

    C语言求最大公约数GCD的算法 C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) #include < ...

  3. quake3中求1/sqrt(x)的算法源代码

    quake3中求1/sqrt(x)的算法源代码如下(未作任何修改): float Q_rsqrt( float number ) {long i;float x2, y;const float thr ...

  4. Python实现相空间重构求关联维数——GP算法、自相关法求时间延迟tau、最近邻算法求嵌入维数m

    Python实现相空间重构求关联维数--GP算法.自相关法求时间延迟tau.最近邻算法求嵌入维数m GP算法: 若有一维时间序列为{x1,x2,-,xn},对其进行相空间重构得到高维相空间的一系列向量 ...

  5. python解一元二次方程虚根_Python编程实现数学运算求一元二次方程的实根算法示例...

    本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² ...

  6. 求最大公因数的三种算法及简要说明

    求最大公因数的三种算法及简要说明 1.连续整数法 从给定的最小的数开始按1递减,直至找到一个能被两者都整除的数. public static int gcd1(int x, int y){int mi ...

  7. 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法

    基于MATLAB的Kruskal避圈算法求最小生成树 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于MATLAB的Kruskal避 ...

  8. 基于求导的快速exp()算法,exp()快速计算,exp导数算法,exp函数C语言实现

    基于求导的快速exp()算法 如果需要得到exp(x)的连续数列,那么常规方法需要一个一个数的运算,运算量会非常大.此时可以使用以下方法,得到连续的exp(x)数列. 我们知道的导数等于本身.设 求导 ...

  9. python求一元二次方程实根_Python编程实现数学运算求一元二次方程的实根算法示例...

    本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a,b,c),接收3个参数,返回一元二次方程:ax² + ...

最新文章

  1. 《翻译》Intel 64 与 IA-32 架构软件开发者手册卷1翻译
  2. 《ANTLR 4权威指南》——2.1节从ANTLR元语言开始
  3. 使用 Python 一步步搭建自己的区块链
  4. PHP composer的安装和使用
  5. 常用web服务列表(三)
  6. python录制生成自动化脚本_懒人做自动化测试之二--自动化脚本录制
  7. Linux find xargs rm .orig
  8. TensorFlow by Google 实战CNN Machine Learning Foundations: Ep #4 - Coding with CNN
  9. 大一计算机文化基础复习资料,转 大一计算机文化基础试题及答案
  10. 毕业设计-分布式爬虫系统(干货)
  11. 姚前:新型货币战争才刚刚开始
  12. Qt编写安防视频监控系统23-图片地图
  13. 制作自己的ILSVRC2015 VID数据集的一些脚本以及流程
  14. C:警告:assignment to ‘char’ from ‘int *‘ makes integer from pointer without a cast -Wint-conversion
  15. java的path的设置路径_java安装path设置
  16. DailyFi - 9.2 |Loot,黑纸白字?
  17. java jndi lookup_[导入]websphere下使用jndi lookup
  18. uniapp中使用微信SDK
  19. 深度学习OSSIM关联分析(附源码注解)
  20. Windows7SP1补丁包(Win7补丁汇总)截至2011年04月更新 32位64位

热门文章

  1. VB / VBA 自制二维码小工具
  2. 国产操作系统UOS安装教程
  3. ACL+SASL的认证配置后的Kafka命令操作(Windows版)
  4. android 最好的gtd软件,Windows 上的高颜值 GTD 应用,这可能是最棒的一款了:MyerList...
  5. 夏日当空心深如深渊——雨桐花
  6. 两片74161实现60进制_用二进制计数器集成芯片74161设计:(1)60进制计数器 (2)6×10进制计数器 (3)10×6进制计数器的实验思路...
  7. negroni-gzip源代码分析
  8. ESP32 驱动WS2812B 灯条
  9. C#正则查找字符串是否包含字母
  10. jenkins2.3031 出现“Error 403 No valid crumb was included in the request ”的解决方案