我看到很多人都说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 那么我们为什么要减去呢? 只是想知道。
答案 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(:+)