在Ruby中生成素数(Codewars kata:数字中的素数)
我已经解决了一个代码战争卡塔,但我不能提交它,因为我的代码需要太长时间。很多人都有这个问题,但我们看不到解决办法。问题是,生成素数花费的时间太长(超过12秒)(我用一种方法生成素数) 在我的计算机中,我可以要求类素数,这就解决了问题。但是在Codewar中不能要求质数类,因此,我生成质数的方法太慢了 有什么帮助吗在Ruby中生成素数(Codewars kata:数字中的素数),ruby,Ruby,我已经解决了一个代码战争卡塔,但我不能提交它,因为我的代码需要太长时间。很多人都有这个问题,但我们看不到解决办法。问题是,生成素数花费的时间太长(超过12秒)(我用一种方法生成素数) 在我的计算机中,我可以要求类素数,这就解决了问题。但是在Codewar中不能要求质数类,因此,我生成质数的方法太慢了 有什么帮助吗 require "pry" def primeFactors(n) start_time = Time.now puts start_time # find 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
需要“撬动”
def基本因子(n)
开始时间=time.now
开始时间
#查找小于n的素数
nums=(2..(n-1))。至
奇数| nums=nums.select{| num | num.odd?}
素数=奇数。选择do | num|
是素数(num)
终止
结束时间=time.now
持续时间=结束时间-开始时间
结束时间
#除以mod为1
股息=n
res_primes=[]
当股息>1时
素数。每个do |素数|#素数除数
新红利=红利。到红利/prime
剩余=股息%prime
如果余数为0.0?
股息=新股息
res_primes对于初学者来说,你只需要测试Math.sqrt(n).to_i+1,这对更大的n值应该有帮助
这是因为如果存在系数n=a*b,则
如果a==b==sqrt(n)#基本上是sqrt的定义
或
如果是Basqrt(n)
如果a和b都小于sqrt(n),那么a*bn
其次,这更复杂,你只需要测试素数到那个极限。我可以设想一个缓存素数的方案
希望这能有所帮助。对于初学者来说,您只需要测试Math.sqrt(n).to_i+1,这对更大的n值应该有帮助
这是因为如果存在系数n=a*b,则
如果a==b==sqrt(n)#基本上是sqrt的定义
或
如果是Basqrt(n)
如果a和b都小于sqrt(n),那么a*bn
其次,这更复杂,你只需要测试素数到那个极限。我可以设想一个缓存素数的方案
希望这有帮助。更高级的选项可能如下所示:
# Is this number a prime?
module PrimeChecker
@prime_cache = [2,3]
def self.prime?(n)
search_limit = Math.sqrt(n).to_i + 1
last_cache = @prime_cache[-1]
while last_cache < search_limit do
last_cache += 2
@prime_cache << last_cache if PrimeChecker.prime?(last_cache)
end
@prime_cache.each do |pn|
return true if pn > search_limit
return false if (n % pn) == 0
end
true
end
end
# Sample run
#
# 31 mysh>%=PrimeChecker.prime?(1_000_000_000_000)
# false
# Elapsed execution time = 1.592 seconds.
#
这个数字是素数吗?
模素数检测器
@素数_缓存=[2,3]
def自我素数?(n)
search\u limit=Math.sqrt(n).to\u i+1
last_cache=@prime_cache[-1]
而上次缓存<搜索限制
最后的缓存+=2
@主缓存搜索限制
如果(n%pn)==0,则返回false
终止
符合事实的
终止
终止
#样本运行
#
#31 mysh>%=PrimeChecker.prime?(1\u 000\u 000\u 000)
#假的
#已用执行时间=1.592秒。
#
这是在一台旧机器上运行的,该机器配有慢速CORE 2 Duo处理器。更高级的选项可能如下所示:
# Is this number a prime?
module PrimeChecker
@prime_cache = [2,3]
def self.prime?(n)
search_limit = Math.sqrt(n).to_i + 1
last_cache = @prime_cache[-1]
while last_cache < search_limit do
last_cache += 2
@prime_cache << last_cache if PrimeChecker.prime?(last_cache)
end
@prime_cache.each do |pn|
return true if pn > search_limit
return false if (n % pn) == 0
end
true
end
end
# Sample run
#
# 31 mysh>%=PrimeChecker.prime?(1_000_000_000_000)
# false
# Elapsed execution time = 1.592 seconds.
#
这个数字是素数吗?
模素数检测器
@素数_缓存=[2,3]
def自我素数?(n)
search\u limit=Math.sqrt(n).to\u i+1
last_cache=@prime_cache[-1]
而上次缓存<搜索限制
最后的缓存+=2
@主缓存搜索限制
如果(n%pn)==0,则返回false
终止
符合事实的
终止
终止
#样本运行
#
#31 mysh>%=PrimeChecker.prime?(1\u 000\u 000\u 000)
#假的
#已用执行时间=1.592秒。
#
这是在一台旧机器上运行的,它有一个较慢的CORE 2 Duo处理器。我刚刚测试了你的代码片段,它似乎陷入了一个无限循环(这可能是它在Codewars上失败的原因)我在最后添加了
p primeFactors(8)
,程序永远卡在循环中,而循环我刚刚测试了你的代码片段,它似乎卡在无限循环中(这可能是它在Codewars上失败的原因),我在最后添加了p primeFactors(8)
,而且程序永远卡在循环中,而循环有些人太好了有些人太好了