2

这是我正在做的事情:

(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 总是不同的,但这对我来说似乎是糟糕的设计。

两个问题:

  1. Ruby 中是否有更好的模式来获取数组并将其与自身进行比较?

  2. 我怎样才能避免它总是输出两次。我可以设置一个变量,如果在下一个循环开始之前发生更改,它将中断。这是正确的方法吗?

4

1 回答 1

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

编辑以使用更好的做法(每个块都有第一和第二个数组)

于 2012-05-26T22:38:02.473 回答