- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
Проект Эйлера задача № 1. Сделайте пожалуйста ревью моего кода и эффективность решения данной задачи
Задача: Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел равна 23.
Найдите сумму всех чисел меньше 1000, кратных 3 или 5.
Код:
list_person = [x for x in range(1000) if x % 3 == 0 or x % 5 == 0]
print(sum(list_person))
Ответы (2 шт):
Ответ будет правильный.
Для заданных ограничений меньше 1000
время работы вполне подойдёт.
А вот если вас интересует эффективность для большого диапазона (а задачи проекта Эйлер обычно подразумевают, что без поиска математической подоплёки эффективного решения добиться нелегко), подумайте вот над чем:
Числа, делящиеся на 3, образуют арифметическую прогрессию, её сумму посчитать можно с помощью простой формулы. Количество членов прогрессии будет (1000-1)//3
.
Аналогично для чисел, делящихся на 5.
Однако числа, кратные 15, будут учтены дважды, поэтому нужно ещё посчитать сумму для прогрессии с 15 и вычесть её из результата (это принцип включения-исключения).
n = 1000
n3 = (n-1) // 3
n5 = (n-1) // 5
n15 = (n-1) // 15
res = n3*(n3+1)//2 * 3 + n5*(n5+1)//2 * 5 - n15*(n15+1)//2 * 15
print(res)
list_person = sum(x for x in range(1, 1000) if x % 3 == 0 or x % 5 == 0)
print(list_person)
Этот подход экономит память, так как не создает промежуточный список.