你是否还在为求这两个数而烦恼,看了题解之后也不懂其中原理?,没事,今天我来深度讲解一下为何是这么做。
首先是求最大公约数,首先我们来看一个样例,
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);
}
听懂的点个赞谢谢支持!!!