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

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

如果想要求两个正整数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); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值