我如何迭代Ruby?

时间:2013-07-13 03:07:23

标签: ruby

这个Ruby代码出了什么问题?我正在尝试解决the first Project Euler question

我认为问题出在sum += num的语法中,但我无法弄清楚它的正确语法是什么。

sum = 0
num = 0
num2 = 0

loop do
  num += 1
  if num % 3 == 0
    sum += num
    break if num > 1000
  end
end

loop do
  num2 += 1
  if num2 % 5 == 0
    sum += num2
    break if num2 > 1000
  end
end

puts sum

3 个答案:

答案 0 :(得分:4)

这是另一种选择:

(1...1000).select { |x| x % 3 == 0 || x % 5 == 0 }.reduce(:+)

答案 1 :(得分:3)

你使这个方式比它需要的更复杂。此外,如果数字是3 5的倍数,则会添加两次。尝试这样的事情:

sum = 0 # initialize the sum
(1...1000).each { |x| # loop from 1 to 1000
    sum += x if x % 3 == 0 || x % 5 == 0 # add the number to the sum if it is
                                         # divisible by 3 or 5
}
puts sum # output the sum

答案 2 :(得分:0)

这样运行,你的语法没问题,但没有给出正确的答案,因为如上所述,你在第一个循环中添加两次3和5的倍数,一次加num,第二个循环,num2

所以你有两个循环,但实际上只需要一个。

您只需要考虑一次,您可以检查它是否是3或5的倍数。这将解决您的重复计算问题,并使您的代码更简洁。

此外,就像Doorknob所显示的那样,each语法可以在这些循环上省去一些行。您还可以使用for语法:

for num in (1..1000)
  <stuff here>
end

查看“Loops: How to do thousands of operations with a few lines of code.”中的循环种类。