答复: 求一段连续自然数的最小公倍数

凤舞凰扬 写道
elmar 写道

准备1-N之间的质数的集合
然后求每个质数的不大于N的最大幂,比如N=30时,2对应的最大幂是4。
然后最小公倍数就是所有质数的相应幂的积

比如N=10
小于10的质数有2,3,5,7
对应的最大幂是:3,2,1,1
则最小公倍数是:2^3x3^2x5^1x7^1 = 2520

不过这样做估计会很吃内存的


   楼上列出的这个算法不错,比我前面想出的更好,不过我还是没有理解每个素数不大于N的最大幂所包含的数学原理。


这个算法和楼上的简单的算法的思路是一样的,只不过计算的过程有了变化。
凤舞凰扬 写道

虽然想到下面这个简单的算法,个人认为不算那么高效(因为需要对合数进行分解)。

      1. 对于每个数,如果是素数,则一定是最小公倍数的构成,参与计算。如果是合数,则分解成一组素数。

      2. 对于每个素数,都有一个类似map的结构(这种结构不仅仅是指语言的中map,而是类似的二维表),key为素数,value为素数出现的次数(可以是出现在自然数列中的,也可以是由合数分解出来的)。

      3. 如果合数分解出的素数组存在于map中(key=素数,value>=分解的素数次数),则该合数不参与计算中。


数学原理解释:
1 这里应用了算术基本定理。
   任何一个自然数N>1,都可以唯一的分解成质因数的连乘积,即
  N=(P1^a1)*(P2^a2)......(Pn^an) (N>1)
   其中P1,P2,P3,.......,Pn 为互不相等的质数且递增排列。
    a1,a2,......,an 为自然数。
2 最小公倍数
  整数m>1,n>1,如何求lcm(m,n)呢。
  1 把m,n展开为标准的质数连乘积形式。
  2 则lcm(m,n)的标准的质数连乘积形式中的质数必定来自于m或者n的标准的质数连乘积形式中的质数,其幂值为m,n中该质数对应的幂值的最大值。

  例子
  8=(2^3)
  12=(2^2)(3^1)
  lcm(m,n)=(2^3)(3^1)=24

  扩展一下,如何求N个数的lcm呢。
  1 把N个数展开为标准的质数连乘积形式。
  2 则lcm的标准的质数连乘积形式中的质数必定来自于这N个数的标准的质数连乘积形式中的质数,其幂值为在这N个数的标准的质数连乘积形式中该质数对应的幂值的最大值。
 
  例子
  12=(2^2)(3^1)
  10=(2^1)(5^1)
  8=(2^3)
  lcm=(2^3)(3^1)(5^1)=120

简单的总结一下这种算法的思路,就是确定lcm的质数因子和质数因子的幂指数。

对于leeldy的算法,其实和搂主的还是有一定区别的。
搂主的简单算法可以计算任意的连续整数的lcm。
而leeldy的算法只能计算从1开始的连续N个整数的lcm。

leeldy的算法中
因为是求1-N的连续的整数的lcm,所以1-N中的所有质数都在lcm的标准的质数连乘积中。
而求每个质数的不大于N的最大幂就是求该质数的幂指数了。

你可能感兴趣的:(算法)