小编典典

欧拉计划1:找到1000以下3或5的所有倍数的总和

algorithm

我正在尝试使用Euler项目的Ruby解决数学问题。是我尝试的第一个:

如果我们列出所有低于10的自然数,它们是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。

找出1000以下3或5的所有倍数的总和。

请帮助我改善代码。

total = 0

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

puts total

阅读 357

收藏
2020-07-28

共1个答案

小编典典

更快(恒定时间)答案:

def sum_multiples(multiple, to)
    n = (to-1) / multiple
    n * (n+1) / 2 * multiple
end

irb(main):001:0> sum_multiples(3, 10) + sum_multiples(5, 10) - sum_multiples(15, 10)
=> 23
irb(main):002:0> sum_multiples(3, 1000) + sum_multiples(5, 1000) - sum_multiples(15, 1000)
=> 233168

为什么这样做?sum_multiples计算出multiple最多但不包括的倍数之和to(取决于整数除法)。它首先计算出要求和的倍数的数量(n),然后将1..n
= n(n + 1)/ 2的和的标准公式乘以multiple。利用这一点,我们可以将款项加在一起为3和5倍数然后,我们决不能忘记,有些数字的倍数
3和5,所以我们减去15(3 * 5)的整数倍。

尽管您的答案对于解决此问题的约束已经足够快(在现代硬件上它应在大约1毫秒内运行),但更快的解决方案(例如我提供的解决方案)将产生非常大的结果。

2020-07-28