如何优化代码-它可以工作,但是我知道我缺少很多学习知识

时间:2019-05-29 02:10:12

标签: ruby

我正在进行的练习询问“写一个方法,coprime?(num_1,num_2),它接受两个数字作为args。如果两个数字之间唯一的除数是1,则该方法应返回true。” < / p>

我写了一种方法来完成任务,首先找到所有因素,然后对它们进行排序并寻找重复项。但是我正在寻找有关应该对其进行优化的方面的建议。

该代码有效,但并不干净。

def factors(num)
 return (1..num).select { |n| num % n == 0}
end

def coprime?(num_1, num_2)
  num_1_factors = factors(num_1)
  num_2_factors = factors(num_2)
  all_factors = num_1_factors + num_2_factors
  new = all_factors.sort
  dups = 0
  new.each_index do |i|
    dups += 1 if new[i] == new[i+1]
  end
  if dups > 1
    false
  else
    true
  end    
end

p coprime?(25, 12)    # => true
p coprime?(7, 11)     # => true
p coprime?(30, 9)     # => false
p coprime?(6, 24)     # => false

3 个答案:

答案 0 :(得分:1)

您可以只使用Integer#gcd:

def coprime?(num_1, num_2)
  num_1.gcd(num_2) == 1
end

答案 1 :(得分:1)

您可以使用Euclid's algorithm查找GCD,然后检查它是否为1。

def gcd a, b
  while a % b != 0
    a, b = b, a % b
  end
  return b
end

def coprime? a, b
  gcd(a, b) == 1
end

p coprime?(25, 12)    # => true
p coprime?(7, 11)     # => true
p coprime?(30, 9)     # => false
p coprime?(6, 24)     # => false```

答案 2 :(得分:0)

您不需要比较所有因素,只需比较主要因素。 Ruby确实带有Prime class

require 'prime'

def prime_numbers(num_1, num_2)
  Prime.each([num_1, num_2].max / 2).map(&:itself)
end

def factors(num, prime_numbers)
  prime_numbers.select {|n| num % n == 0}
end

def coprime?(num_1, num_2)
 prime_numbers = prime_numbers(num_1, num_2)
 # & returns the intersection of 2 arrays (https://stackoverflow.com/a/5678143)
 (factors(num_1, prime_numbers) & factors(num_2, prime_numbers)).length == 0
end