Вместо того чтобы использовать решения на основе диапазона / петли, вы можете использовать больше математики, чем грубой силы.
Существует простой способ получить сумму, кратную числу, меньшему, чем число.
Например, сумма, кратная 3 до 1000: 3 + 6 + 9 + ... + 999
Который может быть переписан как: 3 * (1 + 2 + 3 + ... + 333)
Существует простой способ суммирования всех чисел 1-N:
Sum(1,N) = N*(N+1)/2
Таким образом, функция выборки будет
unsigned int unitSum(unsigned int n)
{
return (n*(n+1))/2;
}
Таким образом, теперь все кратные 3, меньшие 1000 (до 999 включительно), теперь уменьшены до:
3*unitSum((int)(999/3))
Вы можете сделать то же самое для кратных 5:
5*unitSum((int)(999/5))
Но есть одна оговорка! Оба этих числа кратны обоим, таким как 15, 30 и т. Д.
Он считает их дважды, по одному на каждого. Таким образом, чтобы уравновесить это, вы вычитаете один раз.
15*unitSum((int)(999/15))
Итак, в целом, уравнение:
sum = 3*unitSum((int)(999/3)) + 5*unitSum((int)(999/5)) - 15*unitSum((int)(999/15))
Так что теперь вместо того, чтобы циклически проходить по большому набору чисел и делать сравнения, вы просто делаете простое умножение!