论坛首页 综合技术论坛

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

浏览 10720 次
精华帖 (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 慢很多。。。
0 请登录后投票
   发表时间:2009-11-05  
   感觉后面几个朋友又把简单问题复杂化了....
0 请登录后投票
   发表时间:2009-11-05  
恩,看起来之前的方法还有问题。
其实可以分为奇偶两部分,偶数提取公因数2之后就成了连续整数,然后再分奇偶,依此类推。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics