我正在尝试使用Euler项目的Ruby解决数学问题。这是我尝试的第一个:
如果我们列出所有低于10的自然数,它们是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。 找出1000以下3或5的所有倍数的总和。
如果我们列出所有低于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
更快(恒定时间)答案:
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)的整数倍。
sum_multiples
multiple
to
n
尽管您的答案对于解决此问题的约束已经足够快(在现代硬件上它应在大约1毫秒内运行),但更快的解决方案(例如我提供的解决方案)将产生非常大的结果。