最大公约数和最小公倍数深度剖析

你是否还在为求这两个数而烦恼,看了题解之后也不懂其中原理?,没事,今天我来深度讲解一下为何是这么做。


首先是求最大公约数,首先我们来看一个样例,

6 8

我们想找这两个数的最大公约数,我们应先用大的8对6取余即可,为什么呢?因为我们要先求大的8对小的数6多出来的结果,比如这里8%6=2。或是这个例子,50 8,我们不用考虑中间的能整除8的情况,即将50拆开成(48+2)与8比较,48与8最大公约数肯定是8,2与8的最大公约数是2,所以50与8的最大公约数是2。

总结:以大数a和小数b举例,最大公约数是将大的数a拆开(即取余的情况),考虑的是不能整除部分a%b和另一个数b的最大公约数。因为是取余所以a%b<b,如果a%b==0,表示a能整除b,当前b就是最大公约数,不能则继续将大的数b给当前的变量a,小的数a%b给当前的b;

代码是这么写的:

int gcd(int a, int b){
    do{
        int c = a%b;
        a = b;
        b = c;
    }while(b);
    return a;
}

那么最小公倍数如何求呢?

我们可以发现如果两个数最大公倍数是两个数乘积除以最大公约数。

比如50 和8 

刚刚我们计算出最大公约数是2,最大公倍数是50*8/2=200;

为什么呢?

50/2=25,8/2=4,等于说现在25和4是没有公因子的,她两的最大公倍数就等于它两相乘及100,此时只需再填一个最大公约数2即可。

所以代码如下

int lcm(int a, int b){
    return a*b / gcd(a, b);
}

听懂的点个赞谢谢支持!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值