红宝石挖掘工

Dig ruby with Pickaxe

[回忆]我的第一个Ruby脚本——分解质因数

xavier posted @ 2009年8月15日 20:56 in Ruby成就 with tags ruby 分解质因数 mathn , 2476 阅读

最早写这个的时候是2006年,我还在上高一。用了大概两个中午的时间。

写完之后才发现原来mathn库里已经有了这个方法。

不过令人欣慰的是我写的比它快!

以下是代码

def prime_division(number)
  raise ZeroDivisionError if number == 0
  result, str = [], number.to_s
  if start = str[/0+$/]    #如果以待分解的数以0结尾
    zeroc = str.length - start.length   #直接把所有0分解为2和5
    result = [2,5] * zeroc
    number = str[0,start.length].to_i
  end
  while number % 2 == 0    #如果是偶数,直接除以2
    result << 2     #把2的分解提取出来,后面可以忽略偶数的情况
    number /= 2
  end
  3.step((number**0.5).to_i,2) do |i|
    while number % i == 0
      result << i
      number /= i
    end
  end
  result << number unless number == 1 #加上最后剩下的那个质数
  return result.sort!
end

 

 

看Benchmark测试结果(Ubuntu9.10,ruby1.8.7p22)

Benchmark.bm do |x|
  x.report("mathn") { 1.upto(10000) {|i| i.prime_division } }
  x.report("mine") { 1.upto(10000) {|i| prime_division(i) } }
end
 

=> user system total real
mathn 2.400000 0.010000 2.410000 ( 2.511380)
mine 0.630000 0.000000 0.630000 ( 0.661835)

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter