浏览 1773 次
锁定老帖子 主题:答复: 求一段连续自然数的最小公倍数
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-10-26
最后修改:2010-08-02
凤舞凰扬 写道 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的最大幂就是求该质数的幂指数了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |