Python

Проект Эйлера / Правильно ли решил задачу? Python

Задача 1
Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел равна 23.

Найдите сумму всех чисел меньше 1000, кратных 3 или 5.

Код:

# Задача 1

non_x = 0
non_y = 0

pol = int(input('Диапазон = '))

i = 0
v = 0

# ///3
for i in range(pol):
i + +1
if (i / 3) - (i // 3) == 0:
non_x = non_x + i

# ///5

for v in range(pol):
v + +1
if (v / 5) - (v // 5) == 0:
non_y = non_y + v

non = int(non_x) + int(non_y)

print(non)

Если делать так, как предлагает Elepsis Eclipse, то формула будет немного сложнее:

print(3 * (1 + 1000 // 3) * (1000 // 3) // 2 + 5 * (1 + 1000 // 5) * (1000 // 5) // 2 - 15 * (1 + 1000 // 15) * (1000 // 15) // 2)

из-за того, что простое суммирование дважды учитывает числа, кратные НОК (3, 5) = 15.

В твоём коде та же самая ошибка: ты не учитываешь, что числа, одновременно кратные и 3, и 5, суммируются дважды.

Самое короткое решение задачи получается при тупом переборе значений:

print(sum([i for i in range(1, 1001) if (i % 3) * (i % 5) == 0]))

P.S. Для проверки делимости писать (i / 3) - (i // 3) == 0 бессмысленно. Выражение i % 3 == 0 короче, проще, понятнее и быстрее выполняется.
ЕШ
Евгений Шаповалов
66 781
Лучший ответ
Николай Володин Не дурно, спасибо много узнал, только вот, а решается-то правильно?) то есть ответ
Николай Володин Мда, если первая относительно сложная в плане гибкости и понимания для меня, что будет дальше
3 + 6 + 9 + 12 + . . . 999 = 3 * (1 + 2 + 3 + .333) = 3 * ( 1 + 333 ) * 333 / 2

5 + 10 + 15 + . . . 1000 = 5 * (1 + 2 + 3 + .200) = 5 * ( 1 + 200 ) * 200 / 2

Поэтому это решается так:

print( ( 3 * ( 1 + 333 ) * 333 + 5 * ( 1 + 200 ) * 200 ) / 2 )

в одну строчку)) Эйлер бы одобрил... вместо перебора в лоб)
Антон Ильдутов
Антон Ильдутов
62 360
Евгений Шаповалов Числа, кратные 15, в твоей формуле суммируются дважды
Не жалей компуктер! Он для того и нужен, чтобы выполнять много вычислений)
print(sum(x for x in range(1, 1000) if not x % 3 and not x % 5))
Алексей Таран
Алексей Таран
18 091