Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中生成素数(Codewars kata:数字中的素数)_Ruby - Fatal编程技术网

在Ruby中生成素数(Codewars kata:数字中的素数)

在Ruby中生成素数(Codewars kata:数字中的素数),ruby,Ruby,我已经解决了一个代码战争卡塔,但我不能提交它,因为我的代码需要太长时间。很多人都有这个问题,但我们看不到解决办法。问题是,生成素数花费的时间太长(超过12秒)(我用一种方法生成素数) 在我的计算机中,我可以要求类素数,这就解决了问题。但是在Codewar中不能要求质数类,因此,我生成质数的方法太慢了 有什么帮助吗 require "pry" def primeFactors(n) start_time = Time.now puts start_time # find prime

我已经解决了一个代码战争卡塔,但我不能提交它,因为我的代码需要太长时间。很多人都有这个问题,但我们看不到解决办法。问题是,生成素数花费的时间太长(超过12秒)(我用一种方法生成素数)

在我的计算机中,我可以要求类素数,这就解决了问题。但是在Codewar中不能要求质数类,因此,我生成质数的方法太慢了

有什么帮助吗

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)
,而且程序永远卡在
循环中,而
循环有些人太好了有些人太好了