关于求最大公倍数的不同算法比较
关于求最大公倍数的不同算法比较
如果想要求两个正整数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); }
关于求最大公倍数的不同算法比较相关推荐
- c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法
C 语言求最大公约数和最小公倍数算法 C 语言求最大公约数和最小公倍数可以说是C 语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容.其算法方面除常用的辗转相除法外.还 ...
- C语言求最大公约数GCD的算法(附完整源码)
C语言求最大公约数GCD的算法 C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) #include < ...
- quake3中求1/sqrt(x)的算法源代码
quake3中求1/sqrt(x)的算法源代码如下(未作任何修改): float Q_rsqrt( float number ) {long i;float x2, y;const float thr ...
- Python实现相空间重构求关联维数——GP算法、自相关法求时间延迟tau、最近邻算法求嵌入维数m
Python实现相空间重构求关联维数--GP算法.自相关法求时间延迟tau.最近邻算法求嵌入维数m GP算法: 若有一维时间序列为{x1,x2,-,xn},对其进行相空间重构得到高维相空间的一系列向量 ...
- python解一元二次方程虚根_Python编程实现数学运算求一元二次方程的实根算法示例...
本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² ...
- 求最大公因数的三种算法及简要说明
求最大公因数的三种算法及简要说明 1.连续整数法 从给定的最小的数开始按1递减,直至找到一个能被两者都整除的数. public static int gcd1(int x, int y){int mi ...
- 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法
基于MATLAB的Kruskal避圈算法求最小生成树 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于MATLAB的Kruskal避 ...
- 基于求导的快速exp()算法,exp()快速计算,exp导数算法,exp函数C语言实现
基于求导的快速exp()算法 如果需要得到exp(x)的连续数列,那么常规方法需要一个一个数的运算,运算量会非常大.此时可以使用以下方法,得到连续的exp(x)数列. 我们知道的导数等于本身.设 求导 ...
- python求一元二次方程实根_Python编程实现数学运算求一元二次方程的实根算法示例...
本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a,b,c),接收3个参数,返回一元二次方程:ax² + ...
最新文章
- 《翻译》Intel 64 与 IA-32 架构软件开发者手册卷1翻译
- 《ANTLR 4权威指南》——2.1节从ANTLR元语言开始
- 使用 Python 一步步搭建自己的区块链
- PHP composer的安装和使用
- 常用web服务列表(三)
- python录制生成自动化脚本_懒人做自动化测试之二--自动化脚本录制
- Linux find xargs rm .orig
- TensorFlow by Google 实战CNN Machine Learning Foundations: Ep #4 - Coding with CNN
- 大一计算机文化基础复习资料,转 大一计算机文化基础试题及答案
- 毕业设计-分布式爬虫系统(干货)
- 姚前:新型货币战争才刚刚开始
- Qt编写安防视频监控系统23-图片地图
- 制作自己的ILSVRC2015 VID数据集的一些脚本以及流程
- C:警告:assignment to ‘char’ from ‘int *‘ makes integer from pointer without a cast -Wint-conversion
- java的path的设置路径_java安装path设置
- DailyFi - 9.2 |Loot,黑纸白字?
- java jndi lookup_[导入]websphere下使用jndi lookup
- uniapp中使用微信SDK
- 深度学习OSSIM关联分析(附源码注解)
- Windows7SP1补丁包(Win7补丁汇总)截至2011年04月更新 32位64位
热门文章
- VB / VBA 自制二维码小工具
- 国产操作系统UOS安装教程
- ACL+SASL的认证配置后的Kafka命令操作(Windows版)
- android 最好的gtd软件,Windows 上的高颜值 GTD 应用,这可能是最棒的一款了:MyerList...
- 夏日当空心深如深渊——雨桐花
- 两片74161实现60进制_用二进制计数器集成芯片74161设计:(1)60进制计数器 (2)6×10进制计数器 (3)10×6进制计数器的实验思路...
- negroni-gzip源代码分析
- ESP32 驱动WS2812B 灯条
- C#正则查找字符串是否包含字母
- jenkins2.3031 出现“Error 403 No valid crumb was included in the request ”的解决方案