以下是我正在做的事情:
(1..999).each do |a|
(1..999).each do |b|
if Math.sqrt(a**2 + b**2) % 1 == 0 && a + b + Math.sqrt(a**2 + b**2) == 1000 && a >= b
puts a * b * Math.sqrt(a**2 + b**2)
end
end
end
正在发生的事情是a
和b
在公式中是可互换的,因此有两个匹配,因此puts
输出两次。为了解决这个问题,我添加了a >= b
,现在只输出一次。但是,如果a == b
它输出两次。我知道在我使用的例子中a和b总是不同的,但这对我来说似乎是糟糕的设计。
两个问题:
Ruby中是否有更好的模式用于获取数组并将其与自身进行比较?
如何避免输出两次始终。我可以设置一个变量,如果在下一个循环开始之前发生变化就会爆发。这是正确的方法吗?
答案 0 :(得分:5)
#using combination
(1..999).to_a.combination(2).each do |low, high|
if Math.sqrt(low**2 + high**2) % 1 == 0 && low + hight + Math.sqrt(low**2 + high**2) == 1000
puts low * high * Math.sqrt(low**2 + high**2)
end
end
编辑使用更好的练习(每个块有第一个和第二个数组阵列)