我正在进行的练习询问“写一个方法,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
答案 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