锁定老帖子 主题:求一段连续自然数的最小公倍数
精华帖 (0) :: 良好帖 (3) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-04
最后修改:2009-11-05
分组么,分一两次没什么效果的。想想就知道 gcd(a, a+1) 的辗转相除只用 1 步 ……
但是可以每步都分两组,二叉后变成只用求 log(m) 次 lcm。 最后就是(非常粗略的估算,用了很多约等于) O((m/2) * log(n) + (m/4) * log(n^2) + (m/8) * log(n^4) + ... ) = O(m * log(m) * log(n) / 2) require 'mathn' range = 15..1000 puts range.inject(range.to_a){|acc, _| if acc.size == 1 break acc[0] else acc.each_slice(2).map{|(a,b)| a.lcm(b || 1)} end } load 素数表要分配内存吧,内存比 CPU 慢很多。。。 |
|
返回顶楼 | |
发表时间:2009-11-05
感觉后面几个朋友又把简单问题复杂化了....
|
|
返回顶楼 | |
发表时间:2009-11-05
恩,看起来之前的方法还有问题。
其实可以分为奇偶两部分,偶数提取公因数2之后就成了连续整数,然后再分奇偶,依此类推。 |
|
返回顶楼 | |