Мне действительно нравится ответ marcog.
Но в любом случае, здесь используется подход, который использует что-то вроде сита Эратосфена .
divisors = [3, 5]
limit = 1000
can_be_divided = Array.new(limit + 1, false)
divisors.each do |d|
i = d
while i < limit
can_be_divided[i] = true
i += d
end
end
result = 0
can_be_divided.each_with_index { |v, i| result += i if v }
Мое решение использует O (N) памятии грубый O (D * N), где N - предел, а D - количество делителей.
Он не конкурирует с элегантным математическим решением, но, возможно, вы найдете его интересным.
Я думаю,Преимущество состоит в том, что с увеличением количества делителей математическое решение будет сложнее рассчитать, так как вам нужно работать со знаменателями.В случае [3, 5] это довольно просто - единственный знаменатель равен 15. Но как насчет [3, 5, 7, 11, 13]?Вам придется написать код, который найдет все общие знаменатели, и его будет не так легко прочитать.