RE:项目Euler 1:找到1000条评论下所有3或5的倍数之和

时间:2014-10-10 05:14:38

标签: ruby

我看到很多人都说3和5的倍数总和为1000,而其他人则说另一个。有些包括15的倍数,有些不包括。那么,它实际上是什么?

(1..1000).to_a.each do |i|
  num = []
  if i % 3 == 0
    num << i
    p num
  elsif i % 5 == 0
    num << i
    p num
  end
end

我知道有更好的方法对此进行编码,但是当我运行此代码时,我不会重复。意思是没有两个15s 那么我们为什么要减去呢? 只是想知道。

1 个答案:

答案 0 :(得分:2)

基于项目euler的原始问题陈述,这种陈述不那么含糊:

  

如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23.求下面3或5的所有倍数的总和1000。

这意味着&#34; 3或5&#34;的倍数,其自然包括15的倍数或相反的倍数。但是,您的代码无效,因为

  • 每次迭代时num变量都会重置为空数组。您应该在循环外部初始化变量
  • 无需将数字存储在数组中,我们可以直接计算总和。
  • 1..1000会迭代到1000,但问题显然要求我们找到&#34;所有3或5的倍数低于 1000&#34; 。您可以使用独占范围1...1000(三个点)或通过编写1..999来实现此目的。这应该是导致错误结果的主要原因。
  • to_a没有必要。
  • 您可以将条件与||结合使用,因此您不必两次编写相同的内码。

所有这些导致

sum = 0
(1...1000).each do |i|
  if i % 3 == 0 || i % 5 == 0
    sum += i
  end
end

对于更具功能性的方法,您可以按如下方式重写:

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