【发布时间】:2018-10-24 14:33:00
【问题描述】:
我已经解决了一个 Codewars kata,但我无法提交它,因为我的代码耗时太长。很多人都有这个问题,但我们看不到解决方案。问题是,生成素数需要太长时间(超过 12 秒)(我用一种方法生成素数)。
在我的计算机中,我可以要求 Prime 类,这就解决了问题。但是在 Codewar 中不能要求 Prime 类,因此,我生成素数的方法太慢了。
有什么帮助吗?
require "pry"
def primeFactors(n)
start_time = Time.now
puts start_time
# find prime numbers smaller than n
nums = (2..(n-1)).to_a
odd_nums = nums.select { |num| num.odd? }
primes = odd_nums.select do |num|
is_prime(num)
end
end_time = Time.now
duration = end_time - start_time
puts end_time
# divide until mod is 1
dividend = n
res_primes = []
while dividend > 1
primes.each do |prime| # prime divisor
new_dividend = dividend.to_f / prime
remainder = dividend % prime
if remainder.zero?
dividend = new_dividend
res_primes << prime
break
end
end
end
freqs = {}
res_primes.each do |res_prime|
freqs[res_prime] = res_primes.count(res_prime)
end
res_string = []
freqs.keys.each do |key|
if freqs[key] == 1
res_string << "(#{key})"
else
res_string << "(#{key}**#{freqs[key]})"
end
end
res_string.join
end
def is_prime(n)
(2..n/2).none?{|i| n % i == 0}
end
【问题讨论】:
-
我刚刚测试了你的代码 sn-p,它似乎陷入了无限循环(这可能是它在 Codewars 上失败的原因)我刚刚在最后添加了
p primeFactors(8),程序得到了永远卡在while循环中
标签: ruby