我有一个有趣的问题。给定一个数组,我想知道该数组中是否有任何两个数字,如果相乘则等于第三个数字n
如果有,我会打印到控制台,如果没有
,则打印为false实施例
array = [4,7,9,13]
n = 63
从9 * 7 = 63
def multiply_to (array, n)
if array.any?(2){|a,b| a * b == n}
puts "true"
else
puts "false"
end
end
我是Ruby
的新手,但这段代码不起作用。我哪里做错了。任何帮助表示赞赏。提前致谢
答案 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 > 0
和n
是一个完美的正方形,我们要求它的平方根在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