Ruby - 查找数组中是否有任何两个数字乘以等于第三个数字

时间:2015-01-23 17:35:29

标签: ruby arrays

我有一个有趣的问题。给定一个数组,我想知道该数组中是否有任何两个数字,如果相乘则等于第三个数字n

如果有,我会打印到控制台,如果没有

,则打印为false

实施例

array = [4,7,9,13]
n = 63

9 * 7 = 63

开始,这将返回true
def multiply_to (array, n)
  if array.any?(2){|a,b| a * b == n}
    puts "true"
  else
    puts "false"
  end
end

我是Ruby的新手,但这段代码不起作用。我哪里做错了。任何帮助表示赞赏。提前致谢

3 个答案:

答案 0 :(得分:3)

你可以写下来:

def multiply_to(array, n)
  array.combination(2).any? { |a,b| a * b == n }
end

array = [4,7,9,13]
n = 63
puts multiply_to array, n
# >> true

array = [4,7,91,13]
n = 63
puts multiply_to array, n
# >> false

#any?没有接受任何争论,但你传递了论证。所以你得到了有效的错误:

# `any?': wrong number of arguments (1 for 0) (ArgumentError)

答案 1 :(得分:0)

我想展示一个稍微复杂的版本

def multiply_to (array,n)
  numbers = array.map{|x|[x]}
  pairs = []

  for i in 0..numbers.length-1
    pairs.concat numbers[i].product(array - numbers[i])
  end

  puts "#{pairs.count{|a,b|a * b == n} > 0}"

end

在不提供Ruby功能的语言中,您需要做一些工作。

我们可以将我们的组合存储在名为pairs

的数组中

我们想迭代数组中的每个数字。对于所有这些数字,我们想要使用该元素和数组的所有其他数字来获取数组的乘积。

这给了我们所有两个数字的组合。我们可以按如下方式测试这个方法

multiply_to([4,7,9,13], 63)
=> true

答案 2 :(得分:0)

我们获得了一系列数字arr和一个目标产品n。您没有说明arr是否仅包含整数,如果是,则整数是否必须为非负数。部分基于你的例子,我将做出这两个假设,但可以修改方法来处理假设的一些变化。

我会建议一个应该相对有效的解决方案。基准测试使用的是暴力,需要最多n*n次乘法和比较。

我认为以下所有操作都是n中的线性操作。

首先,如果n = 0,我们要求arr至少包含两个元素,其中至少有一个元素为零:

(arr.size > 1 && arr.index(0)) if n.zero?

如果n > 0n是一个完美的正方形,我们要求它的平方根在arr中至少出现两次:

sqrt = f(n)
arr.count(sqrt) > 1

有很快的方法可以计算整数平方根,(或者说不存在一个),例如Newton's Method

接下来,创建一个包含arr因子n的唯一元素的集合:

require 'set'
sarru = arr.each_with_object(Set.new) { |e,s| s << e if n%e == 0 }

以及这些元素的数组:

arru = sarru.to_a

最后,逐步执行arru并检查集合sarru是否包含互补因子n/e(非常快):

factor = arru.find { |e| sarru.include?(n/e) }

然后我们返回:

factor ? [factor, n/factor] : nil