关于 欧几里得算法 和 辗转相除 2022/2/18

gcd()和lcm()

 

 

 

要想证明这东西也很简单 :

                             

我们把a与b相乘,会发现:对于任意的pi,它的指数为max(a,b)+min(a,b)=a+b;

所以每一个因子都会满足,所以就是这样了。。。

 

关于最大公约数的计算方法:

我下面就介绍一种:

我先扯一下啥是欧几里得算法:

其实就是让我筛选出n以内所有的素数,使其时间复杂度为o(n);

直接举例子吧(max==12)

我们先找到最小的质数2,让2挨个乘每一个数(0到12),得到的数放进筛除表(即我们筛出来的合数),接着再筛3,再筛5,再筛7.。。(即把0到十二的每个数都乘一遍这个素数)

那你可能就会有疑问了,比如2*6=12,3*4也等于12,那我到底筛哪个呢?

那你可问对了,我们观察一下图,会发现我们是在6*2的时候把12筛掉的,因为我们在第一轮乘2的时候12就筛掉了,再到了3*4的时候一看有过12了,直接跳过,不要管他就完了

 还有几个问题

1.max是啥??  其实max就是n啊,我们就是想要求max以内的质数,那你可能就有疑问了(其实是我有这个疑问),我筛掉的数早就都已经大于12了,为啥要一直筛到十二呢?其实我们要的是没被除掉的数,可以看出,在12时素数表内的数正好是12以内的素数!!

2.我要让1到12的数乘素数,那素数是怎么来的呢??  其实我给你模拟一下你就知道了,比如i=2的时候,我把4放入筛数表那四以内的数就可以把它放入我们的素数表了(4以内的素数就已经被筛完了),下一轮我就乘素数表里的素数就行了!!

 

 

比如说:让你输入两个数,并输出其最大公约数:

                         

  当然,关于定义gcd亦可以用三母运算缩成一行:

 上难度!

这玩意,用最麻烦的方法就是:根据那个神仙定理可以知道输出的两数的乘积就是gcd*lcm,把乘积的所有因子列举出来,一个一个试,代码如下:

       

 

当然,了解了一下旁边大佬的方法,复杂度就没那么贱了:

就是用最大公约数除以最小公倍数,把所得的数字结果写成质数乘积的形式,让其中的每一个数。。。。哎呀,有点难说,还是举个栗子吧:

比如最小公倍数是60,最大公约数是3,那就用60/3=20,20=2*2*5.,则有这些组合方式:    

{3,3*2*2*5} {3*2,3*2*5} {3*5,3*2*2} {3*2*5,3*2} {3*2*2*5,3} {3*2*2,3*5}

 

好了,就先讲到这吧

再见,祝你好运!           2022/2/18

 

posted @ 2022-02-18 19:40  你的小垃圾  阅读(24)  评论(0编辑  收藏  举报